1. Inleiding
1.1 Inleiding
We besloten om een korte blog te schrijven voor elke C# ontwikkelaar die graag een integratie oplossing wil ontwikkelen tussen systemen zoals Dropbox, Exchange of vele anderen. We hebben een voorbeeld korte applicatie die dient als demo van hoe eenvoudig een dergelijke integratie kan worden bereikt met behulp van de Connect Bridge platform.
1.2 Vereisten
U kunt het artikel scannen om het concept van het Connect Bridge platform te begrijpen. Bovendien bieden wij ook gratis proeflicentie van de software op aanvraag voor het geval u wilt om te spelen met het op uw eigen.
2. Scenario-eisen
Het integratiescenario dat hier nodig is, is om maak een backup van je exchange email bijlagen naar je Dropbox map. Kan handig zijn om een backup te hebben, of om uw exchange gebruik tot een minimum te beperken of andere redenen.
3. Basis-Workflow
Ongeacht de integratie-oplossing die u moet implementeren, er zijn 3 eenvoudig te volgen basisstappen die u moet uitvoeren. Deze stappen worden hierna behandeld.
3.1 De CB Query Analyzer configureren
De eerste stap is ervoor te zorgen dat u verbinding kunt maken met het doelsysteem (in ons scenario Exchange & Dropbox). De eenvoudigste manier om dat te doen is via CB Query Analyzer. Hier heb ik mijn ConnectBridge-server al geconfigureerd via de beheertool om verbinding te maken met MS Exchange 365 en met mijn Dropbox door de vereiste groepen en gebruikers aan te maken. Ik heb een gebruikersnaam aangemaakt met de naam “martin” met wachtwoord “1234”. Deze gebruiker heeft rechten om verbinding te maken met Exchange365 en Dropbox. Nu ga ik vanuit Query Analyzer twee verbindingen maken met elk doelsysteem en controleren of ik succesvol verbinding kan maken.

Figuur 1: Rekeningenadministratie

Figuur 2: Beheer van groepen en gebruikers

Figuur 3: Query Analyzer Verbindingen
3.2 Test uw verklaringen
Zoals hierboven getoond hebben we een succesvolle configuratie en verbinding met beide doelsystemen. Nu kunnen we onze verklaringen testen.
3.2.1. Downloaden van bijlagen van Exchange
Op mijn exchange account, heb ik een aantal emails, met slechts 3 emails die bijlagen hebben zoals hieronder weergegeven
Figuur 4: Exchange E-mails

Om de bijlagen van exchange te downloaden, moeten we 3 stappen volgen:
1. Verkrijg lijst van e-mail ID's met bijlagen:
Het uitvoeren van het onderstaande statement zou ons 3 ID's moeten geven aangezien we slechts 3 emails met bijlagen hebben, zoals getoond in Figuur 4 hierboven. Om te testen neem ik de ID van de email die 2 bijlagen heeft en krijg de lijst van zijn emailbijlagen in de volgende stap.
SELECT ID FROM Message WHERE HasAttachment = true;
Figuur 5 hieronder toont de uitvoer van het uitvoeren van het bovenstaande statement.
2. Verkrijg de lijst van bijlagen van elke e-mail:
Het uitvoeren van het onderstaande statement zou ons 2 rijen moeten geven, één voor de readme.txt en één voor de logo.jpg, zoals getoond in Figuur 4 hierboven. Elke bijlage heeft een veld genaamd adres, dat in de volgende stap gebruikt zal worden om de bijlage te downloaden
EXEC SP_SELECT_ATTACHMENTS 'AAMkADljZGY4ZjYzLWY2MDUtN…………';
Figuur 6 hieronder toont de uitvoer van het uitvoeren van het bovenstaande statement.
3. Haal de bijlagen:
Nu zal ik de bijlage logo.jpg downloaden met het adres dat ik in de vorige stap heb gekregen
EXEC SP_SAVE_ATTACHMENT 'AAMkADljZGY4ZjYzLWY2MDUtNDBjOC0…….';
Figuur 7 hieronder toont de uitvoer van het uitvoeren van het bovenstaande statement.
Opmerking: we hebben een tabel en 2 opgeslagen procedures gebruikt die worden aangeboden door Exchange Connector. Voor meer informatie over tabellen en opgeslagen procedures die worden aangeboden door de connector, raadpleeg de “Exchange Aansluiting Referentie” document.

Figuur 5: Verkrijg lijst van e-mail ID's met bijlagen

Figuur 6: Lijst van bijlagen uit een e-mail ophalen

Figuur 7: Een bijlage ophalen
3.2.2 Een bestand uploaden naar Dropbox
Dit is een eenvoudige stap. Om een bestand naar Dropbox te uploaden, voeren we een opgeslagen procedure “SP_UPLOADFILE” uit die de vereiste API's op Dropbox aanroept om een bestand te uploaden. Voor het gemak uploaden we een tekstbestand.
SP_UPLOADFILE:
EXEC SP_UPLOADFILE '@path', '@filename', '@content';
De bovenstaande opgeslagen procedure verwacht de inhoud van het bestand in bytes.
Ik wil graag een tekstbestand met de naam “eerste.txt” naar de hoofdmap van Dropbox. De inhoud van het bestand is “Hello World”. Zoals afgesproken, moeten we dat bericht “Hello World” omzetten naar bytes via uw eigen code of een online converter.
EXEC SP_UPLOADFILE '/', 'first.txt', ‘SGVsbG8gV29ybGQ=’;
Opmerking: Voor meer informatie over tabellen en opgeslagen procedures die door de Dropbox-connector worden aangeboden, raadpleeg je de “Dropbox Connector Verwijzing” document.
Figuur 8 en Figuur 9 hieronder tonen de uitvoering en de output van de bovenstaande opgeslagen procedure.

Figuur 8: Een bestand uploaden naar Dropbox

Figuur 9: Bestand geüpload
3.3 Kopieerverbinding en verklaringen
Nu weten we dat we bijlagen kunnen downloaden van Exchange en we weten ook dat we documenten kunnen uploaden naar Dropbox. We hebben ook onze SQL statements getest. Wat we nu moeten doen is de connectiestring van Query Analyzer en onze geteste statements kopiëren naar onze C# applicatie.
Om de verbinding van query analyzer te kopiëren, hoeven we alleen maar met de rechtermuisknop op de verbinding te klikken, op Bewerken te klikken en naar het tabblad Geavanceerd te gaan en daar de tekst te kopiëren, zoals hieronder in Figuur 10 is te zien.
Figuur 10: Connectiestring kopiëren vanuit Query Analyzer

Hier zijn mijn verbindingsstrings voor beide doelsystemen.
Exchange
Driver={Media Gateway ODBC Driver};impl='CORBA';host='localhost';port='8087';acc='ACC_EXCH365_CU7';uid='martin';pwd='1234'
Dropbox
Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'
Nu zijn we klaar om visual studio.net te openen en te beginnen met de implementatie van onze C# integratie oplossing.
4. Doorloop van de oplossing
4.1 Een nieuwe C# toepassing maken
Het volstaat om een eenvoudige console-applicatie te maken. Onze oplossing vereist geen externe verwijzingen of de implementatie van pakketten van derden. De oplossing is gebaseerd op ODBC; daarom hoeven we alleen maar de vereiste naamruimten naar onze klasse te importeren.
met behulp van System.Data; gebruik System.Data.Odbc;
4.2 Maak & Open een verbinding naar Exchange
1. Specificeer de verbindingsreeks
string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234'";
2. Maak en open de verbinding:
using (OdbcConnection connection = new OdbcConnection(connectionString)) { connection.Open(); ………………………… }
4.3 Download bijlagen van Exchange
1. Download de ID's van Exchange-e-mails met bijlagen naar een DataTable “messageIDs”. We gaan een DataAdapter “messagesAdapter” gebruiken om verbinding te maken en de ID's te downloaden.
using (OdbcDataAdapter messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection))
{
messagesAdapter.Fill(messageIDs);
}
2. Voor elke e-mail-ID in de tabel “messageIDs” krijgen we een lijst met bijlagen “alleen ter informatie” en slaan we deze op in een andere DataTable “documentsListTable”. We gaan een andere DataAdapter “documentsListAdapter” gebruiken om die lijst met bijlagen op te halen.
foreach (DataRow messageIDRow in messageIDs.Rows)
{
string sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';",
messageIDRow["ID"]);
using (OdbcDataAdapter documentsListAdapter = new OdbcDataAdapter
(sqlQueryString, verbinding))
documentsListAdapter.Fill(documentsListTable);
}
3. Voor elke bijlage in de “documentsListTable” halen we het adres op en gebruiken we dat om de daadwerkelijke bijlage op te halen en vervolgens voegen we die bijlage toe aan een derde tabel “documentsTable”. We gaan een andere DataAdapter “documentsAdapter” gebruiken om de bijlagen/documenten op te halen.
foreach (DataRow documentInfoRow in documentsListTable.Rows)
{
string sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';",
documentInfoRow["Adres"]);
using (documentsAdapter = new OdbcDataAdapter(sqlQueryString, verbinding))
documentsAdapter.Fill(documentsTable);
}
4. Voor elke succesvol gedownloade bijlage van exchange, een bericht weergeven aan de gebruiker met de bestandsnaam van de bijlage.
foreach (DataRow documentRow in documentsTable.Rows)
Console.WriteLine(string.Format("{0} gedownload!",
documentRow["OutFileName"]);
4.4 Sluit de verbinding met Exchange
als (connection.State == ConnectionState.Open)
connection.Close();
4.5 Een verbinding met Dropbox maken en openen
1. Specificeer de verbindingsreeks
string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'";
2. Maak en open de verbinding:
using (OdbcConnection connection = new OdbcConnection(connectionString)) { connection.Open(); ………………………… }
4.6 Upload de bijlagen naar Dropbox
Voor elk bijlagebestand in de “documentsTable”, krijgen we de bestandsnaam “OutFileName” en de inhoud van het bestand “OutBuffer” en sla het bestand op in de hoofdmap van Dropbox “/”.
We hebben geen nieuwe DataAdapter nodig, we hebben alleen een OdbcCommand nodig op basis van “SP_UPLOADFILE” eerder besproken opgeslagen procedure, en we moeten de vereiste parameters hieraan toevoegen, zodat we de vereiste waarden aan de opgeslagen procedure kunnen doorgeven.
foreach (DataRow documentRow in documentsTable.Rows)
{
using (OdbcCommand command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?",
verbinding))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@path", "/");
command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]);
command.Parameters.AddWithValue("@content", documentRij["OutBuffer"]);
fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Geüpload!" :
"Niet geüpload!";
Console.WriteLine("{0} : {1}", documentRow["OutFileName"],
fileUploadStatus);
}
}
4.7 Sluit de verbinding met Dropbox
als (connection.State == ConnectionState.Open)
connection.Close();
5. De oplossing uitvoeren

Figuur 11: De oplossing uitvoeren

Figuur 12: Dropbox-inhoud na het uitvoeren van de oplossing
6. Opmerkingen over de oplossing
We hebben geprobeerd de logica van de toepassing zo eenvoudig mogelijk te houden, maar de logica zou kunnen worden verbeterd door bijlagen van elke uitwisselings-e-mail in een afzonderlijke map op te slaan, waarbij de mapnaam een deel van de bericht-ID of een andere unieke identifier zou kunnen zijn.
Om het eenvoudig te houden, hebben we veel essentiële coderingsnormen genegeerd, waaronder, maar niet beperkt tot:
1. Verbindingsstrings in een configuratiebestand
2. Hashen en versleutelen van wachtwoorden met een hashcode en een zout
3. Het implementeren van design patterns zoals Single Responsibility Principle of nog beter, Dependency Inversion Principle
7. Volledige broncode
met behulp van System;
met behulp van System.Data;
gebruik System.Data.Odbc;
namespace MySolution
{
klasse Programma
{
static void Main(string[] args)
{
//Voorzie verbinding
string connectionString = string.Empty;
string sqlQueryString = string.Empty;
OdbcConnection verbinding;
OdbcCommand commando;
DataTable documentsTable = nieuwe DataTable();
OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter;
DataTable messageIDs = nieuwe DataTable();
DataTable documentsListTable = nieuwe DataTable();
//Aanmaken van verbinding met Exchange
connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234'";
using (connection = new OdbcConnection(connectionString))
{
//open verbinding
connection.Open();
//laad bericht-id's voor berichten met bijlagen
using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection))
{
/vullen tabel messageIDs met berichten
messagesAdapter.Fill(messageIDs);
}
//voor elk bericht met bericht-id, lijst met bijlagen ophalen
foreach (DataRow messageIDRow in messageIDs.Rows)
{
sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';", messageIDRow["ID"]);
using (documentsListAdapter = new OdbcDataAdapter(sqlQueryString, verbinding))
documentsListAdapter.Fill(documentsListTable);
}
//haal elke bijlage op en sla het op in documentsTable
foreach (DataRow documentInfoRow in documentsListTable.Rows)
{
sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';", documentInfoRow["Address"]);
using (documentsAdapter = new OdbcDataAdapter(sqlQueryString, verbinding))
documentsAdapter.Fill(documentsTable);
}
//terugkoppeling geven aan gebruiker dat deze bestanden zijn gedownload
foreach (DataRow documentRow in documentsTable.Rows)
Console.WriteLine(string.Format("{0} gedownload!", documentRow["OutFileName"]));
//sluit de verbinding met Exchange
als (connection.State == ConnectionState.Open)
connection.Close();
}
//verbinding met DropBox maken
connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'";
using (connection = new OdbcConnection(connectionString))
{
//open verbinding
connection.Open();
//document upload status plaatshouder
string fileUploadStatus = string.Empty;
//voor elk document dat we in onze documentsTable hebben
foreach (DataRow documentRow in documentsTable.Rows)
{
//roep een opgeslagen procedure aan om het bestand te uploaden
using (command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@path", "/");
command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]);
command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);
//controleer de status en geef weer op het scherm
fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Geüpload!" : "Niet geüpload!";
Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus);
}
}
//sluit de verbinding met Dropbox
als (connection.State == ConnectionState.Open)
connection.Close();
}
//terugkoppeling geven aan gebruiker
Console.WriteLine("alles gedaan...");
Console.ReadKey();
}
}
}
