1. Introduzione
1.1 Introduzione
Abbiamo deciso di scrivere un breve blog per tutti gli sviluppatori di C# che desiderano sviluppare una soluzione di integrazione tra sistemi come Dropbox, Exchange o molti altri. Abbiamo creato una breve applicazione di esempio che serve come dimostrazione di come una tale integrazione può essere realizzata in modo semplice utilizzando il sistema Connect Bridge piattaforma.
1.2 Prerequisiti
È possibile scansionare l'articolo per capire il concetto della piattaforma Connect Bridge. Inoltre, su richiesta, forniamo anche una licenza di prova gratuita del software nel caso in cui vogliate giocarci da soli.
2. 2. Requisiti dello scenario
Lo scenario di integrazione qui richiesto è creare un backup dagli allegati delle e-mail di scambio alla cartella Dropbox. Potrebbe essere utile per avere un backup, o per ridurre al minimo l'utilizzo dello scambio o per altri motivi.
3. 3. Flusso di lavoro di base
Non importa quale sia la soluzione di integrazione che vi viene richiesta per l'implementazione, ci sono 3 semplici passi di base da seguire che dovete eseguire. Questi passi sono i prossimi.
3.1 Configurare l'analizzatore di query CB
Il primo passo è assicurarsi di essere in grado di connettersi al sistema di destinazione (Exchange e Dropbox nel nostro scenario); il modo più semplice per farlo è tramite CB Query Analyzer. In questo caso, ho già configurato il mio server ConnectBridge tramite lo strumento di amministrazione per connettermi a MS Exchange 365 e a Dropbox, creando i gruppi e gli utenti necessari. Ho creato un nome utente chiamato “martin” con password “1234”. Questo utente ha i diritti per connettersi a Exchange365 e Dropbox. Ora da Query Analyzer creerò 2 connessioni a ciascun sistema di destinazione e mi assicurerò di potermi connettere con successo.

Figura 1: Amministrazione dei conti

Figura 2: Amministrazione dei gruppi e degli utenti

Figura 3: Connessioni dell'analizzatore di interrogazione
3.2 Testate le vostre dichiarazioni
Come mostrato sopra, abbiamo una configurazione e una connessione di successo con entrambi i sistemi di destinazione. Ora possiamo testare le nostre affermazioni.
3.2.1. Scaricare gli allegati da Exchange
Sul mio account di scambio ho un paio di email, con solo 3 email che hanno allegati come mostrato di seguito
Figura 4: Email Exchange

Per scaricare gli allegati dallo scambio, dobbiamo seguire 3 passi:
1. 1. Ottenere una lista di ID e-mail con allegati:
L'esecuzione della seguente dichiarazione dovrebbe fornirci 3 ID in quanto abbiamo solo 3 e-mail con allegati, come mostrato nella Figura 4 sopra. Per il test prenderò l'ID dell'email che ha 2 allegati e otterrò la lista dei suoi allegati nella prossima fase.
SELEZIONARE ID DAL Messaggio DOVE È STATO FATTO = vero;
La figura 5 qui sotto mostra l'output dell'esecuzione della dichiarazione di cui sopra.
2. 2. Ricevi l'elenco degli allegati da ogni e-mail:
L'esecuzione della seguente dichiarazione, dovrebbe darci 2 righe, una per il readme.txt e una per il logo.jpg, come mostrato nella Figura 4 sopra. Ogni allegato avrà un campo chiamato indirizzo che verrà utilizzato nella fase successiva per scaricare l'allegato
EXEC SP_SELECT_ATTACHMENTS 'AAMkADljZGY4ZjYzLWY2MDUtN............';
La figura 6 qui sotto mostra l'output dell'esecuzione della dichiarazione di cui sopra.
3. 3. Prendi gli allegati:
Ora, scaricherò l'allegato logo.jpg utilizzando il suo indirizzo che ho ottenuto dal passo precedente
EXEC SP_SAVE_ATTACHMENT 'AAMkADljZGY4ZjYzLWY2MDUtNDBjOC0.......';
La figura 7 qui sotto mostra l'output dell'esecuzione della dichiarazione di cui sopra.
Nota: abbiamo utilizzato una tabella e 2 stored procedure offerte dal connettore Exchange; per ulteriori informazioni sulle tabelle e le stored procedure offerte dal connettore, consultare la sezione “Exchange Riferimento connettore” documento.

Figura 5: Ottenere una lista di ID e-mail con allegati

Figura 6: Ottenere la lista degli allegati da una e-mail

Figura 7: Ottenere un allegato
3.2.2 Caricare un file su Dropbox
Si tratta di un passaggio immediato. Per caricare un file su Dropbox, eseguiamo una stored procedure “SP_UPLOADFILE” che richiama le API necessarie a Dropbox per caricare un file. Per semplicità, caricheremo un file di testo.
SP_UPLOADFILE:
EXEC SP_UPLOADFILE '@path', '@nome file', '@contenuto';
La procedura di memorizzazione sopra descritta prevede che il contenuto del file sia in byte.
Vorrei caricare un file di testo chiamato “primo.txt” nella directory principale di Dropbox. Il contenuto del file sarà “Hello World”; come concordato, dobbiamo convertire il messaggio “Hello World” in byte tramite il vostro codice o un qualsiasi convertitore online.
EXEC SP_UPLOADFILE '/', 'first.txt', ‘SGVsbG8gV29ybGQ=’;
Nota: Per ulteriori informazioni sulle tabelle e sulle stored procedure offerte dal connettore Dropbox, consultare il documento “Riferimento connettore Dropbox” documento.
La Figura 8 e la Figura 9 qui sotto mostrano l'esecuzione e l'uscita della procedura memorizzata di cui sopra.

Figura 8: Caricamento di un file su Dropbox

Figura 9: File caricato
3.3 Copiare il collegamento e le dichiarazioni
Ora sappiamo che siamo in grado di scaricare gli allegati da Exchange e sappiamo anche che possiamo caricare i documenti su Dropbox. Abbiamo anche testato le nostre dichiarazioni SQL. Quello che dobbiamo fare ora è copiare la stringa di connessione da Query Analyzer e le nostre istruzioni testate nella nostra applicazione C#.
Per copiare la connessione dall'analizzatore di interrogazione, basta cliccare con il tasto destro del mouse sulla connessione, cliccare su Modifica e andare alla scheda Avanzate e copiare il testo da lì come mostrato in Figura 10.
Figura 10: Copia della stringa di connessione da Query Analyzer

Ecco le mie stringhe di connessione per entrambi i sistemi di destinazione.
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'.
Ora siamo pronti ad aprire visual studio.net e ad iniziare ad implementare la nostra soluzione di integrazione C#.
4. 4. Soluzione Passeggiata della soluzione
4.1 Creare una nuova applicazione C#
È sufficiente per creare una semplice applicazione console. La nostra soluzione non richiede alcun riferimento esterno o la distribuzione di pacchetti di terze parti. La soluzione si basa su ODBC; pertanto, è sufficiente importare gli spazi dei nomi richiesti nella nostra classe.
utilizzando System.Data; utilizzando System.Data.Odbc;
4.2 Creare e aprire una connessione a Exchange
1. 2. Specificare la stringa di connessione
string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234'";
2. 2. Creare e aprire la connessione:
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
connection.Open();
..............................
}
4.3 Scaricare gli allegati da Exchange
1. Scaricare gli ID delle e-mail Exchange con allegati in una tabella di dati “messageIDs”. Useremo un DataAdapter “messagesAdapter” per connetterci e scaricare gli ID.
utilizzando (OdbcDataAdapter messagesAdapter = nuovo OdbcDataAdapter ("SELECT ID FROM Message where HasAttachment = true;", connessione))
{
messagesAdapter.Fill(messageIDs);
}
2. Per ogni ID di e-mail nella tabella “messageIDs”, otterremo un elenco di allegati “solo info” e li salveremo in un'altra tabella di dati “documentsListTable”. Utilizzeremo un altro DataAdapter “documentsListAdapter” per ottenere l'elenco degli allegati.
foreach (DataRow messageIDRow in messageIDs.Rows)
{
stringa sqlQueryString = stringa.Formato("EXEC SP_SELECT_ATTACHMENTS '{0}';",
messageIDRow["ID"]);
utilizzando (OdbcDataAdapter documentsListAdapter = nuovo OdbcDataAdapter
(sqlQueryString, collegamento))
documentsListAdapter.Fill(documentsListTable);
}
3. Per ogni allegato presente in “documentsListTable”, otterremo l'indirizzo e lo utilizzeremo per ottenere l'allegato vero e proprio, per poi aggiungerlo a una terza tabella “documentsTable”. Utilizzeremo un altro DataAdapter “documentsAdapter” per ottenere gli allegati/documenti.
foreach (DataRow documentInfoRow in documentsListTable.Rows)
{
stringa sqlQueryString = stringa.Formato ("EXEC SP_SAVE_ATTACHMENT '{0}';",
documentoInfoRow["Indirizzo"]);
utilizzando (documentsAdapter = nuovo OdbcDataAdapter(sqlQueryString, connessione))
DocumentiAdapter.Fill(documentsTable);
}
4. 4. Per ogni allegato scaricato con successo dallo scambio, visualizzare un messaggio all'utente utilizzando il nome del file allegato.
foreach (DataRow documentRow documentRow in documentsTable.Rows)
Console.WriteLine(stringa.Formato("{0} scaricato!",
documentRow["OutFileName"]));
4.4 Chiudere il collegamento a Exchange
if (connection.State == ConnectionState.Open)
connection.Close();
4.5 Creare e aprire una connessione a Dropbox
1. 2. Specificare la stringa di connessione
string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'";
2. 2. Creare e aprire la connessione:
using (OdbcConnection connection = new OdbcConnection(connectionString))
{
connection.Open();
..............................
}
4.6 Caricare gli allegati su Dropbox
Per ogni file allegato nella cartella “documentiTabella”, otterremo il nome del file “OutFileName” e il contenuto del file “OutBuffer” e salvare il file nella cartella principale di Dropbox “/”.
Non serve un nuovo DataAdapter, ma solo un OdbcCommand basato su “SP_UPLOADFILE” discussa in precedenza e dobbiamo aggiungervi i parametri necessari, in modo da poter passare i valori richiesti alla stored procedure.
foreach (DataRow documentRow documentRow in documentsTable.Rows)
{
utilizzando (comando OdbcCommand = nuovo OdbcCommand("Exec SP_UploadFile ?, ?, ?, ?",
collegamento))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@path", "/");
command.Parameters.AddWithValue("@nomeFile", documentRow["OutFileName"]);
command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);
fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Caricato! :
"Non Caricato!
Console.WriteLine("{0} : {1}", documentRow["OutFileName"],
fileUploadStatus);
}
}
4.7 Chiudere il collegamento a Dropbox
if (connection.State == ConnectionState.Open)
connection.Close();
5. Esecuzione della soluzione

Figura 11: Esecuzione della soluzione

Figura 12: Contenuto della Dropbox dopo l'esecuzione della soluzione
6. 6. Note sulla soluzione
Abbiamo cercato di mantenere la logica dell'applicazione il più semplice possibile, tuttavia la logica potrebbe essere migliorata salvando gli allegati di ogni e-mail di scambio in una cartella separata, dove il nome della cartella potrebbe essere una parte dell'ID del messaggio o qualsiasi altro identificatore univoco.
Per semplicità abbiamo ignorato molti standard di codifica essenziali, tra cui, ma non solo, gli standard di codifica:
1. Avere le stringhe di connessione in un file di configurazione
2. 2. Hashing e crittografare le password utilizzando un codice hash e un sale
3. 3. Implementare modelli di progettazione come il principio della responsabilità unica o, ancora meglio, il principio dell'inversione di dipendenza
7. 7. Codice sorgente completo
utilizzando System;
utilizzando System.Data;
utilizzando System.Data.Odbc;
Spazio dei nomi MySolution
{
classe Programma
{
vuoto statico Principale(stringa[] args)
{
//fornire il collegamento
string connectionString = string.empty;
string sqlQueryString = string.empty;
OdbcConnection connection;
Comando OdbcCommand;
DataTable documentsTableTable = nuova DataTable();
OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter;
DataTable messageIDs = nuova DataTable();
DataTable documentsListTable = nuova DataTable();
//creare il collegamento a Exchange
connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234'";
utilizzando (connessione = nuova OdbcConnection(connectionString))
{
//allacciamento aperto
connection.Open();
// caricare gli ID dei messaggi per i messaggi con allegati
utilizzando (messagesAdapter = nuovo OdbcDataAdapter ("SELECT ID FROM Message where HasAttachment = true;", connessione))
{
//riempire la tabella messageIDs con i messaggi
messagesAdapter.Fill(messageIDs);
}
// per ogni messaggio che utilizza l'id del messaggio, ottenere l'elenco degli allegati
foreach (DataRow messageIDRow in messageIDs.Rows)
{
sqlQueryString = stringa.Formato("EXEC SP_SELECT_ATTACHMENTS '{0}';", messageIDRow["ID"]);
utilizzando (documentsListAdapter = nuovo OdbcDataAdapter(sqlQueryString, connessione))
documentsListAdapter.Fill(documentsListTable);
}
// ottenere ogni allegato e salvarlo in documentiTabella
foreach (DataRow documentInfoRow in documentsListTable.Rows)
{
sqlQueryString = string.Formato ("EXEC SP_SAVE_ATTACHMENT '{0}';", documentInfoRow["Indirizzo"]);
utilizzando (documentsAdapter = nuovo OdbcDataAdapter(sqlQueryString, connessione))
documentiAdapter.Fill(documentsTable);
}
// dare un feedback all'utente che quei file sono stati scaricati
foreach (DataRow documentRow documentRow in documentsTable.Rows)
Console.WriteLine(stringa.Formato("{0} scaricato!", documentRow["OutFileName"]));
//chiudere la connessione a Exchange
if (connection.State == ConnectionState.Open)
connection.Close();
}
//creare il collegamento a DropBox
connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234'";
utilizzando (connessione = nuova OdbcConnection(connectionString))
{
//allacciamento aperto
connection.Open();
// segnaposto per lo stato di caricamento dei documenti
string fileUploadStatus = string.Empty;
// per ogni documento che abbiamo nei nostri documentiTabella
foreach (DataRow documentRow documentRow in documentsTable.Rows)
{
//chiama una stored procedure per caricare il file
utilizzando (comando = nuovo OdbcCommand("Exec SP_UploadFile ?, ?, ?, ?", connessione))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@path", "/");
command.Parameters.AddWithValue("@nomeFile", documentRow["OutFileName"]);
command.Parameters.AddWithValue("@content", documentRow["OutBuffer"]);
//controllare lo stato e la visualizzazione sullo schermo
fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Caricato! : "Non Caricato!";
Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus);
}
}
//chiudere il collegamento a Dropbox
if (connection.State == ConnectionState.Open)
connection.Close();
}
//dare un feedback all'utente
Console.WriteLine ("tutto fatto...");
Console.ReadKey();
}
}
}
