1. Einführung
1.1 Einleitung
Wir haben beschlossen, einen kurzen Blog für alle C#-Entwickler zu schreiben, die eine Integrationslösung zwischen Systemen wie Dropbox, Exchange und vielen anderen entwickeln möchten. Wir haben eine Beispiel-Kurzanwendung erstellt, die als Demo dafür dient, wie einfach eine solche Integration mit dem Connect Bridge Plattform.
1.2 Voraussetzungen
Sie können den Artikel einscannen, um das Konzept der Connect Bridge-Plattform zu verstehen. Darüber hinaus stellen wir auf Anfrage eine kostenlose Testlizenz der Software zur Verfügung, falls Sie selbst damit spielen möchten.
2. Szenario-Anforderungen
Das hier erforderliche Integrationsszenario ist Erstellen Sie eine Sicherungskopie von den Anhängen Ihrer Exchange-E-Mails in Ihrem Dropbox-Ordner. Könnte nützlich sein, um ein Backup zu haben, oder um Ihre Austauschnutzung auf ein Minimum zu beschränken oder aus anderen Gründen.
3. Grundlegender Arbeitsablauf
Unabhängig von der Integrationslösung, die Sie implementieren müssen, gibt es drei grundlegende, einfach zu befolgende Schritte, die Sie ausführen müssen. Diese Schritte werden im Folgenden behandelt.
3.1 Konfigurieren des CB-Abfrage-Analysators
Im ersten Schritt müssen Sie sicherstellen, dass Sie sich mit dem Zielsystem (Exchange und Dropbox in unserem Szenario) verbinden können; am einfachsten geht das über CB Query Analyzer. Hier habe ich meinen ConnectBridge Server bereits über das Administrationstool konfiguriert, um eine Verbindung zu MS Exchange 365 und zu meiner Dropbox herzustellen, indem ich die erforderlichen Gruppen und Benutzer angelegt habe. Ich habe einen Benutzernamen namens "martin" mit Passwort "1234”. Dieser Benutzer hat die Rechte zur Verbindung mit Exchange365 und Dropbox. Nun werde ich vom Query Analyzer aus 2 Verbindungen zu jedem Zielsystem erstellen und sicherstellen, dass ich mich erfolgreich verbinden kann.
Abbildung 1: Kontenverwaltung
Abbildung 2: Gruppen- und Benutzerverwaltung
Abbildung 3: Query-Analyzer-Verbindungen
3.2 Testen Sie Ihre Aussagen
Wie oben gezeigt, haben wir eine erfolgreiche Konfiguration und Verbindung zu beiden Zielsystemen. Jetzt können wir unsere Aussagen testen.
3.2.1. Herunterladen von Anhängen von Exchange
Auf meinem Austauschkonto habe ich einige E-Mails, aber nur 3 E-Mails mit Anhängen, wie unten dargestellt
Abbildung 4: E-Mails austauschen
Um die Anhänge aus dem Austausch herunterzuladen, müssen wir 3 Schritte befolgen:
1. Liste der E-Mail-IDs mit Anhängen abrufen:
Die Ausführung der untenstehenden Erklärung sollte uns 3 IDs liefern, da wir nur 3 E-Mails mit Anhängen haben, wie in Abbildung 4 oben gezeigt. Zum Testen nehme ich die ID der E-Mail, die 2 Anhänge hat, und erhalte im nächsten Schritt die Liste ihrer E-Mail-Anhänge.
SELECT ID FROM Message WHERE HasAttachment = true;
Abbildung 5 unten zeigt das Ergebnis der Ausführung der obigen Anweisung.
2. Erhalten Sie eine Liste der Anhänge von jeder E-Mail:
Wenn Sie die untenstehende Anweisung ausführen, sollten Sie 2 Zeilen erhalten, eine für die readme.txt und eine für die logo.jpg, wie in Abbildung 4 oben gezeigt. Jeder Anhang wird ein Feld namens Adresse haben, das im nächsten Schritt zum Herunterladen des Anhangs verwendet wird
EXEC SP_SELECT_ATTACHMENTS 'AAMkADljZGY4ZjYzLWY2MDUtN…………';
Abbildung 6 unten zeigt das Ergebnis der Ausführung der obigen Anweisung.
3. Holen Sie sich die Anhänge:
Nun werde ich den Anhang logo.jpg herunterladen, wobei ich die Adresse verwende, die ich aus dem vorherigen Schritt erhalten habe
EXEC SP_SAVE_ATTACHMENT 'AAMkADljZGY4ZjYzLWY2MDUtNDBjOC0…….';
Abbildung 7 unten zeigt das Ergebnis der Ausführung der obigen Aussage.
Hinweis: Wir haben eine Tabelle und 2 Stored Procedures verwendet, die vom Exchange Connector angeboten werden. Weitere Informationen über Tabellen und Stored Procedures, die vom Connector angeboten werden, finden Sie im "Referenz für Austausch-Steckverbinder" Dokument.
Abbildung 5: Liste der E-Mail-IDs mit Anhängen
Abbildung 6: Liste der Anhänge einer E-Mail abrufen
Abbildung 7: Anhang abrufen
3.2.2 Hochladen einer Datei in Dropbox
Dies ist ein direkter Schritt nach vorn. Um eine Datei auf Dropbox hochzuladen, werden wir eine gespeicherte Prozedur "SP_UPLOADFILE" ausführen, die die erforderlichen APIs auf Dropbox aufruft, um eine Datei hochzuladen. Der Einfachheit halber werden wir eine Textdatei hochladen.
SP_UPLOADFILE:
EXEC SP_UPLOADFILE '@path', '@filename', '@content';
Die obige Stored Procedure erwartet den Inhalt der Datei in Bytes.
Ich möchte eine Textdatei mit dem Namen "erste.txt"in das Stammverzeichnis von Dropbox. Der Inhalt der Datei wird "Hello World" sein; wie vereinbart, müssen wir die Nachricht "Hello World" über Ihren eigenen Code oder einen beliebigen Online-Konverter in Bytes umwandeln.
EXEC SP_UPLOADFILE '/', 'first.txt', ‘SGVsbG8gV29ybGQ=’;
Hinweis: Weitere Informationen über Tabellen und gespeicherte Prozeduren, die vom Dropbox-Konnektor angeboten werden, finden Sie im "Referenz des Dropbox-Verbinders" Dokument.
Abbildung 8 und Abbildung 9 unten zeigen die Ausführung und die Ausgabe der obigen Stored Procedure.
Abbildung 8: Hochladen einer Datei in Dropbox
Abbildung 9: Hochgeladene Datei
3.3 Verbindung und Erklärungen kopieren
Jetzt wissen wir, dass wir in der Lage sind, Anhänge von Exchange herunterzuladen, und wir wissen auch, dass wir Dokumente in Dropbox hochladen können. Wir haben auch unsere SQL-Anweisungen getestet. Was wir jetzt tun müssen, ist, den Verbindungsstring vom Query Analyzer und unsere getesteten Anweisungen in unsere C#-Anwendung zu kopieren.
Um die Verbindung aus dem Abfrageanalysator zu kopieren, brauchen wir nur mit der rechten Maustaste auf die Verbindung zu klicken, auf Bearbeiten zu klicken und zur Registerkarte Erweitert zu gehen und den Text von dort aus zu kopieren, wie unten in Abbildung 10 dargestellt.
Abbildung 10: Kopieren der Verbindungszeichenfolge aus Query Analyzer
Hier sind meine Verbindungszeichenfolgen für beide Zielsysteme.
Exchange
Driver={Media Gateway ODBC Driver};impl='CORBA';host='localhost';port='8087';acc='ACC_EXCH365_CU7';uid='martin';pwd='1234'
Postfach
Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'
Jetzt sind wir bereit, visual studio.net zu öffnen und mit der Implementierung unserer C#-Integrationslösung zu beginnen.
4. Lösung Komplettlösung
4.1 Erstellen einer neuen C#-Anwendung
Es ist ausreichend, eine einfache Konsolenanwendung zu erstellen. Unsere Lösung erfordert weder eine externe Referenz noch die Bereitstellung von Paketen Dritter. Die Lösung basiert auf ODBC; daher müssen wir nur die erforderlichen Namespaces in unsere Klasse importieren.
using System.Data; using System.Data.Odbc;
4.2 Erstellen und Öffnen einer Verbindung zu Exchange
1. Geben Sie die Verbindungszeichenfolge
string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234'";
2. Erstellen und öffnen Sie die Verbindung:
using (OdbcConnection connection = new OdbcConnection(connectionString)) { connection.Open(); ………………………… }
4.3 Herunterladen von Anhängen von Exchange
1. Laden Sie die IDs von Exchange-E-Mails mit Anhängen in eine DataTable "messageIDs" herunter. Wir werden einen DataAdapter "messagesAdapter" verwenden, um die IDs zu verbinden und herunterzuladen.
using (OdbcDataAdapter messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection)) { messagesAdapter.Fill(messageIDs); }
2. Für jede E-Mail-ID in der Tabelle "messageIDs" erhalten wir eine Liste von Anhängen "nur Info" und speichern sie in einer anderen DataTable "documentsListTable". Wir werden einen anderen DataAdapter "documentsListAdapter" verwenden, um diese Liste von Anhängen zu erhalten.
foreach (DataRow messageIDRow in messageIDs.Rows) { string sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';", messageIDRow["ID"]); using (OdbcDataAdapter documentsListAdapter = new OdbcDataAdapter (sqlQueryString, connection)) documentsListAdapter.Fill(documentsListTable); }
3. Für jeden Anhang in der "documentsListTable" erhalten wir die Adresse und verwenden sie, um den eigentlichen Anhang zu erhalten, und fügen diesen Anhang dann in eine dritte Tabelle "documentsTable" ein. Wir werden einen weiteren DataAdapter "documentsAdapter" verwenden, um die Anhänge/Dokumente zu erhalten.
foreach (DataRow documentInfoRow in documentsListTable.Rows) { string sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';", documentInfoRow["Address"]); using (documentsAdapter = new OdbcDataAdapter(sqlQueryString, connection)) documentsAdapter.Fill(documentsTable); }
4. Zeigen Sie dem Benutzer für jeden erfolgreich vom Exchange heruntergeladenen Anhang eine Nachricht mit dem Dateinamen des Anhangs an.
foreach (DataRow documentRow in documentsTable.Rows) Console.WriteLine(string.Format("{0} downloaded!", documentRow["OutFileName"]));
4.4 Schließen Sie die Verbindung zur Börse
if (connection.State == ConnectionState.Open) connection.Close();
4.5 Erstellen und Öffnen einer Verbindung zu Dropbox
1. Geben Sie die Verbindungszeichenfolge
string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'";
2. Erstellen und öffnen Sie die Verbindung:
using (OdbcConnection connection = new OdbcConnection(connectionString)) { connection.Open(); ………………………… }
4.6 Hochladen der Anhänge in Dropbox
Für jede Anhangsdatei in der "DokumenteTabelle", erhalten wir den Dateinamen "OutFileName"und den Dateiinhalt "OutBuffer"und speichern Sie die Datei in der Wurzel des Dropbox-Ordners "/".
Wir brauchen keinen neuen DataAdapter, wir brauchen nur einen OdbcCommand basierend auf "SP_UPLOADFILE"Wir müssen die erforderlichen Parameter hinzufügen, damit wir die erforderlichen Werte an die gespeicherte Prozedur übergeben können.
foreach (DataRow documentRow in documentsTable.Rows) { using (OdbcCommand command = new OdbcCommand("Exec SP_UploadFile ?, ?, ?", Verbindung)) { command.CommandType = CommandType.StoredProcedure; command.Parameters.AddWithValue("@path", "/"); command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]); command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]); fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Hochgeladen!" : "Nicht hochgeladen!"; Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus); } }
4.7 Schließen Sie die Verbindung zu Dropbox
if (connection.State == ConnectionState.Open) connection.Close();
5. Ausführen der Lösung
Abbildung 11: Ausführen der Lösung
Abbildung 12: Inhalt der Dropbox nach Ausführung der Lösung
6. Anmerkungen zur Lösung
Wir haben versucht, die Anwendungslogik so einfach wie möglich zu halten. Die Logik könnte jedoch verbessert werden, indem Anhänge von jeder Austausch-E-Mail in einem separaten Ordner gespeichert werden, wobei der Ordnername ein Teil der Nachrichten-ID oder eines anderen eindeutigen Identifikators sein könnte.
Der Einfachheit halber haben wir viele wesentliche Kodierungsstandards ignoriert, unter anderem, aber nicht ausschließlich, die Kodierungsstandards:
1. Verbindungszeichenfolgen in einer Konfigurationsdatei haben
2. Hashing und Verschlüsselung von Kennwörtern mit einem Hash-Code und einem Salt
3. Implementierung von Entwurfsmustern wie dem Single Responsibility-Prinzip oder noch besser dem Prinzip der Umkehrung der Abhängigkeit
7. Vollständiger Quellcode
using System; using System.Data; using System.Data.Odbc; namespace MySolution { Klasse Programm { static void Main(string[] args) { //Verbindung bereitstellen string connectionString = string.Empty; string sqlQueryString = string.Empty; OdbcConnection connection; OdbcCommand Befehl; DataTable documentsTable = new DataTable(); OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter; DataTable messageIDs = new DataTable(); DataTable documentsListTable = new DataTable(); //Erstellen der Verbindung zu 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)) { //Verbindung öffnen connection.Open(); //Nachrichten-IDs für Nachrichten mit Anhängen laden using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection)) { //Füllen der Tabelle messageIDs mit Nachrichten messagesAdapter.Fill(messageIDs); } //für jede Nachricht mit der Nachrichten-ID die Liste der Anhänge abrufen 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); } //jedes Attachment abrufen und in documentsTable speichern 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); } //Dem Benutzer eine Rückmeldung geben, dass die Dateien heruntergeladen wurden foreach (DataRow documentRow in documentsTable.Rows) Console.WriteLine(string.Format("{0} heruntergeladen!", documentRow["OutFileName"])); //Verbindung zu Exchange schließen if (connection.State == ConnectionState.Open) connection.Close(); } //Erstellen der Verbindung zu 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)) { //Verbindung öffnen connection.Open(); //Dokumenten-Upload-Status Platzhalter string fileUploadStatus = string.Empty; //für jedes Dokument, das wir in unserer documentsTable haben foreach (DataRow documentRow in documentsTable.Rows) { //Aufruf einer gespeicherten Prozedur zum Hochladen der Datei 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"]); //Status prüfen und auf dem Bildschirm anzeigen fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Hochgeladen!" : "Nicht hochgeladen!"; Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus); } } //Schließen der Verbindung zu Dropbox if (connection.State == ConnectionState.Open) connection.Close(); } //Feedback an den Benutzer geben Console.WriteLine("alles erledigt..."); Console.ReadKey(); } } }