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 ad ogni sistema di destinazione e mi assicurerò di potermi collegare con successo.
Figura 1: Amministrazione dei conti
Figura 2: Amministrazione di gruppi e 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 usato una tabella e 2 stored procedure offerte da Exchange Connector, per maggiori informazioni sulle tabelle e le stored procedure offerte dal connettore, si prega di fare riferimento al ".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
Questo è un passo avanti. Per caricare un file su Dropbox, eseguiremo una procedura memorizzata "SP_UPLOADFILE" che chiama le API richieste su 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" alla 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 le procedure memorizzate offerte dal connettore Dropbox, si prega di fare riferimento alla "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 creare una semplice applicazione da console. La nostra soluzione non richiede alcun riferimento esterno o la distribuzione di pacchetti di terze parti. La soluzione è basata su ODBC; quindi, abbiamo solo bisogno di importare i namespace richiesti nella nostra classe.
utilizzando System.Data; utilizzando System.Data.Odbc;
4.2 Creare e aprire una connessione all'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. Creare e aprire la connessione:
utilizzando (OdbcConnection connection = nuovo OdbcConnection(connectionString)) { connection.Open(); ………………………… }
4.3 Scaricare gli allegati da Exchange
1. 2. Scaricare gli ID delle e-mail Exchange con allegati ad un DataTable "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 e-mail nella tabella "messageIDs", otterremo una lista di allegati "info only" e li salveremo in un'altra DataTable "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 nella "documentsListTable", otterremo l'indirizzo e lo useremo per ottenere l'allegato effettivo e poi aggiungeremo quell'allegato ad 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. Creare e aprire la connessione:
utilizzando (OdbcConnection connection = nuovo OdbcConnection(connectionString)) { connection.Open(); ………………………… }
4.6 Caricare gli allegati su Dropbox
Per ogni file allegato nel file "documentiTabella", otterremo il nome del file "OutFileName" e il contenuto del file "OutBuffer" e salvare il file nella root della cartella Dropbox "/".
Non abbiamo bisogno di un nuovo DataAdapter, abbiamo solo bisogno di un OdbcCommand basato su "SP_UPLOADFILE"stored procedure" discusso in precedenza, e dobbiamo aggiungere i parametri richiesti, in modo da poter passare i valori richiesti alla stored procedure.
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) ? "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; using System.Data; using System.Data.Odbc; spazio dei nomi MySolution { classe Programma { static void Main(string[] args) { //fornire la connessione string connectionString = string.Empty; string sqlQueryString = string.Empty; OdbcConnection connessione; OdbcCommand command; DataTable documentsTable = new DataTable(); OdbcDataAdapter messagesAdapter, documentsListAdapter, documentsAdapter; DataTable messageIDs = new DataTable(); DataTable documentsListTable = new DataTable(); /creare la connessione all'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)) { //apri la connessione connection.Open(); //caricare gli id dei messaggi con allegati using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection)) { /riempie 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 = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';", messageIDRow["ID"]); using (documentsListAdapter = new OdbcDataAdapter(sqlQueryString, connection)) documentsListAdapter.Fill(documentsListTable); } //raccogliere ogni allegato e salvarlo nella tabella 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); } //dare all'utente il feedback che i file sono stati scaricati foreach (DataRow documentRow in documentsTable.Rows) Console.WriteLine(string.Format("{0} scaricato!", documentRow["OutFileName"])); //chiudere la connessione all'Exchange if (connection.State == ConnectionState.Open) connection.Close(); } //creare la connessione a 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)) { //apri la connessione connection.Open(); // segnaposto dello stato di caricamento del documento string fileUploadStatus = string.Empty; //per ogni documento presente in documentsTable foreach (DataRow documentRow in documentsTable.Rows) { /chiamare una procedura memorizzata per caricare il 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"]); //verifica lo stato e visualizzazione sullo schermo fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Caricato!" : "Non caricato!"; Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus); } } //chiudere la connessione a Dropbox if (connection.State == ConnectionState.Open) connection.Close(); } //dare un feedback all'utente Console.WriteLine("tutto fatto..."); Console.ReadKey(); } } }