1. Введение
1.1 Введение
Мы решили написать небольшой блог для любых разработчиков C#, которые хотели бы разработать интеграционное решение между такими системами, как Dropbox, Exchange и многими другими. Мы создали пример короткого приложения, которое служит в качестве демонстрации того, как простая такая интеграция может быть осуществлена с использованием Connect Bridge платформа.
1.2 Предпосылки
Вы можете просканировать статью, чтобы понять концепцию платформы Connect Bridge. Более того, мы также предоставляем по запросу бесплатную пробную лицензию программы на тот случай, если вы захотите поиграть с ней самостоятельно.
2. Требования к сценарию
Сценарий интеграции, требуемый здесь, заключается в следующем создайте резервную копию вложений электронной почты обмена в папку Dropbox. Может быть полезно иметь резервную копию, или свести к минимуму использование обмена, или по каким-то другим причинам.
3. Базовый документооборот
Независимо от того, какое интеграционное решение вам необходимо внедрить, есть три основных простых шага, которые вам необходимо выполнить. Эти шаги описаны ниже.
3.1 Настройка анализатора запросов CB
Первый шаг - убедиться, что вы можете подключиться к целевой системе (Exchange и Dropbox в нашем сценарии); проще всего это сделать с помощью CB Query Analyzer. Здесь я уже настроил свой сервер ConnectBridge с помощью инструмента администрирования для подключения к MS Exchange 365 и к Dropbox, создав необходимые группы и пользователей. Я создал имя пользователя под названием "martin"с паролем1234”. Этот пользователь имеет права на подключение к Exchange365 и Dropbox. Теперь из Query Analyzer я создам 2 подключения к каждой целевой системе и гарантирую, что смогу успешно подключиться.
Рисунок 1: Администрирование аккаунтов
Рисунок 2: Администрирование групп и пользователей
Рисунок 3: Подключения анализатора запросов
3.2 Проверьте свои показания
Как показано выше, мы имеем успешную конфигурацию и подключение к обеим целевым системам. Теперь мы можем проверить наши утверждения.
3.2.1. Загрузка вложений с Exchange
На моем счету обмена у меня есть пара электронных писем, всего 3 письма, которые имеют вложения, как показано ниже.
Рисунок 4: Exchange Электронная почта
Чтобы загрузить вложения из обмена, нам необходимо выполнить 3 шага:
1. Получить список идентификаторов электронной почты с вложениями:
Выполнение нижеприведенного утверждения должно дать нам 3 ID, так как у нас есть только 3 сообщения с вложениями, как показано на рисунке 4 выше. Для тестирования я возьму ID письма с 2 вложениями и получу список вложений в следующем шаге.
ВЫБЕРИТЕ идентификатор из сообщения, ГДЕ НАСТОЯЩИЙ = true;
На рисунке 5 ниже показан результат выполнения вышеуказанного утверждения.
2. Получить список вложений из каждого письма:
Выполнение нижеследующего утверждения должно дать нам 2 строки, одна для readme.txt и одна для logo.jpg, как показано на рисунке 4 выше. Каждое вложение будет иметь поле под названием адрес, которое будет использоваться в следующем шаге для загрузки вложения
EXEC SP_SELECT_ATTACHMENTS 'AAMKADljZGY4ZjYzLWY2MDUtN............';
На рисунке 6 ниже показан результат выполнения вышеуказанного утверждения.
3. Возьми насадки:
Теперь я скачаю вложение log.jpg, используя его адрес, который я получил с предыдущего шага.
EXEC SP_SAVE_ATTACHMENT 'AAMKADljZGY4ZjYzLWY2MDUtNDBjOC0.......';
На рисунке 7 ниже показан результат выполнения вышеуказанного утверждения.
Примечание: мы использовали таблицу и 2 хранимые процедуры, предлагаемые коннектором Exchange, для получения более подробной информации о таблицах и хранимых процедурах, предлагаемых коннектором, пожалуйста, обратитесь к ".Exchange Разъем Ссылка"Документ.
Рисунок 5: Получить список почтовых ID с вложениями
Рисунок 6: Получить список вложений из электронного письма
Рисунок 7: Получить вложение
3.2.2 Загрузка файла в Dropbox
Это один прямой шаг. Чтобы загрузить файл в Dropbox, мы выполним хранимую процедуру "SP_UPLOADFILE", которая вызывает необходимые API на Dropbox для загрузки файла. Для простоты мы собираемся загрузить текстовый файл.
SP_UPLOADFILE:
EXEC SP_UPLOADFILE '@path', '@filename', '@content';
Вышеуказанная хранимая процедура ожидает содержимое файла в байтах.
Я хотел бы загрузить текстовый файл под названием "first.txt"в корневую директорию Dropbox. Содержимое файла будет "Hello World"; по согласованию мы должны преобразовать это сообщение "Hello World" в байты с помощью вашего собственного кода или любого он-лайн конвертера.
EXEC SP_UPLOADFILE '/', 'first.txt', 'SGVsbG8gV29ybGQ=';
Примечание: Для получения дополнительной информации о таблицах и хранимых процедурах, предлагаемых разъемом Dropbox, пожалуйста, обратитесь к ".Ссылка на разъем Dropbox"Документ.
На рисунках 8 и 9 ниже показаны выполнение и вывод вышеописанной хранимой процедуры.
Рисунок 8: Загрузка файла в Dropbox
Рисунок 9: Загруженный файл
3.3 Копирование связи и заявлений
Теперь мы знаем, что можем загружать вложения с Exchange, а также знаем, что можем загружать документы в Dropbox. Мы также протестировали наши SQL заявления. Теперь нам нужно скопировать строку соединения из Query Analyzer и протестированные операторы в наше приложение C#.
Чтобы скопировать соединение из анализатора запросов, нам нужно просто щелкнуть правой кнопкой мыши на соединении, нажать Edit и перейти в закладку Advanced, а затем скопировать оттуда текст, как показано ниже на рисунке 10.
Рисунок 10: Копирование строки соединения из анализатора запросов
Вот мои соединительные строки для обеих целевых систем.
1ТП23Т
Driver={Media Gateway ODBC Driver};импл='CORBA';host='localhost';port='8087'';acc='ACC_EXCH365_CU7';uid='martin';pwd='1234''
Деппбокс
Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234''.
Теперь мы готовы открыть visual studio.net и приступить к реализации нашего интеграционного решения C#.
4. Прохождение решения
4.1 Создание нового приложения C#
Достаточно создать простое консольное приложение. Наше решение не требует никаких внешних ссылок или установки пакетов сторонних производителей. Решение основано на ODBC, поэтому нам просто нужно импортировать необходимые пространства имен в наш класс.
используя System.Data; используя System.Data.Odbc;
4.2 Создание и открытие соединения с Exchange
1. Укажите строку соединения
string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_EXCH365_CU7';UID='martin';PWD='1234''";
2. Создайте и откройте соединение:
используя (OdbcConnection connection = новое OdbcConnection(connectionString)) { соединение. Open(); ………………………… }
4.3 Загрузка вложений с Exchange
1. Скачайте IDs писем Exchange с прикрепленными к DataTable "messageIDs". Мы будем использовать DataAdapter "messagesAdapter" для подключения и скачивания IDs.
используя (OdbcDataAdapter messagesAdapter = новый OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", соединение))). { messagesAdapter.Fill(messageIDs); }
2. Для каждого почтового ID в таблице "Идентификаторы сообщений" мы получим список вложений "только информация" и сохраним их в другую DataTable "documentsListTable". Мы будем использовать другой DataAdapter "documentsListAdapter", чтобы получить этот список вложений.
передний край (DataRow messageIDRow в messageIDs.Rows). { string sqlQueryString = string.Format("EXEC SP_SELECT_ATTACHMENTS '{0}';", messageIDRow["ID"]); используя (OdbcDataAdapter documentsListAdapter = новый OdbcDataAdapter (sqlQueryString, соединение)) documentsListAdapter.Fill(documentsListTable); }
3. Для каждого вложения в "documentsListTable" мы получим адрес и используем его для получения действительного вложения, а затем добавим это вложение в третью таблицу "documentsTable". Для получения вложений/документов мы будем использовать другой DataAdapter "documentsAdapter".
foreach (DataRow документInfoRow в документахListTable.Rows) { string sqlQueryString = string.Format("EXEC SP_SAVE_ATTACHMENT '{0}';", документInfoRow["Адрес"]); using (documentsAdapter = новый OdbcDataAdapter(sqlQueryString, соединение)) документыАдаптер.заполнение(документыТаблица); }
4. Для каждого успешно загруженного прикрепленного файла при обмене отображается сообщение пользователю с именем файла прикрепленного файла.
foreach (DataRow documentRow в документахTable.Rows) Console.WriteLine(string.Format("{0} downloaded!"), документRow["OutFileName"]));
4.4 Закрыть соединение с 1ТП23Т.
если (connection.State == ConnectionState.Open) соединение. Закрыть();
4.5 Создание и открытие соединения с Dropbox
1. Укажите строку соединения
string connectionString = "Driver={Media Gateway ODBC Driver};IMPL=CORBA;HOST='localhost';PORT='8087';ACC='ACC_DRBX_CBD';UID='martin';PWD='1234''";
2. Создайте и откройте соединение:
используя (OdbcConnection connection = новое OdbcConnection(connectionString)) { соединение. Open(); ………………………… }
4.6 Загрузка вложений в Dropbox
Для каждого файла вложения в "documentsTable"мы получим имя файла"Имя аутФайла"и содержимое файлаOutBuffer"и сохранить файл в корне папки "/".
Нам не нужен новый DataAdapter, нам просто нужна OdbcCommand, основанная на "SP_UPLOADFILE"хранимой процедуры, о которой мы говорили ранее, и нам нужно добавить к ней необходимые параметры, чтобы мы могли передать нужные значения хранимой процедуре.
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!" : "Не загружен!"; Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus); } }
4.7 Закрыть соединение с Dropbox.
если (connection.State == ConnectionState.Open) соединение. Закрыть();
5. Запуск решения
Рисунок 11: Выполнение решения
Рисунок 12: Содержимое папки Dropbox после запуска решения
6. Примечания к решению
Мы постарались максимально упростить логику приложения, однако логику можно было бы улучшить, сохранив вложения из каждого письма обмена в отдельную папку, где имя папки могло бы быть частью ID сообщения или любого другого уникального идентификатора.
Для простоты мы проигнорировали многие основные стандарты кодирования, включая, но не ограничиваясь ими:
1. Имея строки соединения в конфигурационном файле
2. Хэширование и шифрование паролей с помощью хэш-кода и соли
3. Реализация шаблонов дизайна, таких как принцип одиночной ответственности или даже лучше, принцип инверсии зависимости
7. Полный исходный код
using System; using System.Data; using System.Data.Odbc; пространство имен MySolution { class Program { static void Main(string[] args) { //обеспечить подключение 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(); //создание соединения с 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)) { //открываем соединение connection.Open(); //загрузите идентификаторы сообщений для сообщений с вложениями using (messagesAdapter = new OdbcDataAdapter("SELECT ID FROM Message where HasAttachment = true;", connection)) { //заполняем таблицу messageIDs сообщениями messagesAdapter.Fill(messageIDs); } //для каждого сообщения, используя идентификатор сообщения, получить список вложений 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); } //получаем каждый аттачмент и сохраняем его в 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); } //предоставить пользователю информацию о том, что эти файлы были загружены foreach (DataRow documentRow in documentsTable.Rows) Console.WriteLine(string.Format("{0} скачано!", documentRow["OutFileName"])); //закрываем соединение с Exchange if (connection.State == ConnectionState.Open) connection.Close(); } //создание соединения с 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)) { //открываем соединение connection.Open(); // заполнитель статуса загрузки документа string fileUploadStatus = string.Empty; //для каждого документа, который есть в нашей таблице documentsTable foreach (DataRow documentRow in documentsTable.Rows) { //вызов хранимой процедуры для загрузки файла 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"]); // проверяем статус и отображаем на экране fileUploadStatus = (command.ExecuteNonQuery() > 0) ? "Uploaded!" : "Не загружен!"; Console.WriteLine("{0} : {1}", documentRow["OutFileName"], fileUploadStatus); } } //закрываем соединение с Dropbox if (connection.State == ConnectionState.Open) connection.Close(); } //дать обратную связь пользователю Console.WriteLine("все сделано..."); Console.ReadKey(); } } }