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 dem Kennwort "1234". Dieser Benutzer hat die Rechte, sich mit Exchange365 und Dropbox zu verbinden. Jetzt werde ich mit Query Analyzer 2 Verbindungen zu jedem Zielsystem erstellen und sicherstellen, dass ich erfolgreich eine Verbindung herstellen 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 gespeicherte Prozeduren verwendet, die vom Exchange Connector angeboten werden. Weitere Informationen zu den Tabellen und gespeicherten Prozeduren, die vom Connector angeboten werden, finden Sie in der "Referenz für Austausch-SteckverbinderDokument".

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 ganz einfacher Schritt. Um eine Datei auf Dropbox hochzuladen, führen wir eine gespeicherte Prozedur "SP_UPLOADFILE" aus, 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 hochladen, die den Namen "erste.txt" in das Stammverzeichnis von Dropbox. Der Inhalt der Datei wird "Hello World" sein; wie vereinbart, müssen wir diese Nachricht "Hello World" mit Ihrem eigenen Code oder einem Online-Konverter in Bytes umwandeln.
EXEC SP_UPLOADFILE '/', 'first.txt', 'SGVsbG8gV29ybGQ=';
Hinweis: Weitere Informationen zu den Tabellen und gespeicherten Prozeduren, die vom Dropbox-Connector angeboten werden, finden Sie im Abschnitt "Referenz des Dropbox-VerbindersDokument".
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 reicht aus, eine einfache Konsolenanwendung zu erstellen. Unsere Lösung erfordert keinen externen Verweis oder die Bereitstellung von Paketen von Drittanbietern. 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 & Ö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 & Öffnen der 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 eine Verbindung herzustellen und die IDs 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 "info only" und speichern sie in einer anderen DataTable "documentsListTable". Wir werden einen weiteren 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 Tabelle "documentsListTable" wird die Adresse ermittelt und verwendet, um den tatsächlichen Anhang zu erhalten und diesen Anhang dann zu einer dritten Tabelle "documentsTable" hinzuzufügen. 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 & Ö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 & Öffnen der Verbindung:
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
connection.Open();
..............................
}
4.6 Hochladen der Anhänge in Dropbox
Für jede angehängte Datei im Verzeichnis "DokumenteTabelle", erhalten wir den Dateinamen "OutFileName" und die Dateiinhalte "OutBuffer" und speichern Sie die Datei im Stammverzeichnis des Dropbox-Ordners "/".
Wir brauchen keinen neuen DataAdapter, sondern nur einen OdbcCommand, der 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 ?, ?, ?",
connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@path", "/");
command.Parameters.AddWithValue("@filename", documentRow["OutFileName"]);
command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);
fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Uploaded!" :
"Not Uploaded!";
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
{
class Program
{
static void Main(string[] args)
{
//provide connection
string connectionString = string.Empty;
string sqlQueryString = string.Empty;
OdbcConnection connection;
OdbcCommand command;
DataTable documentsTable = new DataTable();
OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter;
DataTable messageIDs = new DataTable();
DataTable documentsListTable = new DataTable();
//creating connection to 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 connection
connection.Open();
//load message ids for messages with attachements
using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection))
{
//fill messageIDs table with messages
messagesAdapter.Fill(messageIDs);
}
//for each message using message id, get list of attachments
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);
}
//get each attachement and save it to 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);
}
//give feedback to user that those files were downloaded
foreach (DataRow documentRow in documentsTable.Rows)
Console.WriteLine(string.Format("{0} downloaded!", documentRow["OutFileName"]));
//close connection to Exchange
if (connection.State == ConnectionState.Open)
connection.Close();
}
//creating connection to 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 connection
connection.Open();
//document upload status placeholder
string fileUploadStatus = string.Empty;
//for each document we have in our documentsTable
foreach (DataRow documentRow in documentsTable.Rows)
{
//call a stored procedure to upload the file
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"]);
//check the status and display on screen
fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Uploaded!" : "Not Uploaded!";
Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus);
}
}
//close connection to Dropbox
if (connection.State == ConnectionState.Open)
connection.Close();
}
//give feedback to user
Console.WriteLine("all done...");
Console.ReadKey();
}
}
}
