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 je verbinding kunt maken met het doelsysteem (Exchange & Dropbox in ons scenario); de eenvoudigste manier om dat te doen is via CB Query Analyzer. Hier heb ik mijn ConnectBridge server al geconfigureerd via de Administration tool 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 genaamd "martin" met wachtwoord "1234". Deze gebruiker heeft rechten om verbinding te maken met Exchange365 en Dropbox. Nu zal ik vanuit Query Analyzer 2 verbindingen maken naar elk doelsysteem en ervoor zorgen dat 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 gebruikten een tabel en 2 stored procedures aangeboden door Exchange Connector, voor meer informatie over tabellen en stored procedures aangeboden door de connector, verwijzen we naar 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 rechttoe rechtaan 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 de eenvoud gaan we een tekstbestand uploaden.
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 uploaden met de naam "eerste.txt" naar de hoofdmap van Dropbox. De inhoud van het bestand, zal "Hello World" zijn; zoals afgesproken, moeten we dat bericht "Hello World" omzetten naar bytes via je eigen code of een online converter.
EXEC SP_UPLOADFILE '/', 'first.txt', 'SGVsbG8gV29ybGQ=';
Opmerking: Voor meer informatie over tabellen en stored procedures die worden aangeboden door de Dropbox-connector, raadpleegt u 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 is voldoende om een eenvoudige console applicatie te maken. Onze oplossing vereist geen externe referentie of een pakket van derden. De oplossing is gebaseerd op ODBC; daarom hoeven we alleen maar de vereiste namespaces in onze klasse te importeren.
met behulp van System.Data; gebruik System.Data.Odbc;
4.2 Een verbinding maken en openen met 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 emails 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 "messageIDs" tabel, zullen we een lijst van bijlagen "info only" ophalen en deze opslaan in een andere DataTable "documentsListTable". We gaan een andere DataAdapter "documentsListAdapter" gebruiken om die lijst van 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", krijgen we het adres en gebruiken dat om de eigenlijke bijlage te krijgen en dan 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 root van Dropbox map "/".
We hebben geen nieuwe DataAdapter nodig, we hebben alleen een OdbcCommand nodig op basis van "SP_UPLOADFILE" opgeslagen procedure besproken, en we moeten de vereiste parameters eraan toevoegen, zodat we de vereiste waarden kunnen doorgeven aan de opgeslagen procedure.
foreach (DataRow documentRow in documentsTable.Rows) { using (OdbcCommand command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?", connection)) { commando.CommandType = CommandType.StoredProcedure; command.Parameters.AddWithValue("@path", "/"); command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]); command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]); fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Uploaded!" : "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
using System; using System.Data; using System.Data.Odbc; namespace MySolution { klasse Programma { static void Main(string[] args) { //verbinden string connectionString = string.Empty; string sqlQueryString = string.Empty; OdbcConnection connection; OdbcCommand commando; DataTable documentsTable = nieuwe DataTable(); OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter; DataTable messageIDs = nieuwe DataTable(); DataTable documentsListTable = nieuwe DataTable(); //verbinding maken 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 messageIDs tabel met berichten messagesAdapter.Fill(messageIDs); } //voor elk bericht met berichtID, 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, connection)) documentsListAdapter.Fill(documentsListTable); } //krijg elke bijlage en sla deze op in documentsTable foreach (DataRow documentInfoRow in documentsListTable.Rows) { sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';", documentInfoRow["Address"]); using (documentsAdapter = new OdbcDataAdapter(sqlQueryString, connection)) documentsAdapter.Fill(documentsTable); } //feedback geven aan gebruiker dat die 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 maken met DropBox 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 placeholder string fileUploadStatus = string.Empty; //voor elk document dat we in onze documentsTable hebben foreach (DataRow documentRow in documentsTable.Rows) { //roep een opgeslagen procedure om het bestand te uploaden using (command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?", connection)) { commando.CommandType = CommandType.StoredProcedure; command.Parameters.AddWithValue("@path", "/"); command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]); command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]); //controleer de status en toon deze op het scherm fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Uploaded!" : "Niet geüpload!"; Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus); } } //de verbinding met Dropbox sluiten als (connection.State == ConnectionState.Open) connection.Close(); } //feedback geven aan gebruiker Console.WriteLine("alles klaar..."); Console.ReadKey(); } } }