Класс клиент для вызова методов сервиса обмена. Исключения которые могут генерировать методы сервиса: ServerException - ошибка сервера InvalidOperationException - ошибка обработки ответа сервиса TimeoutException - ошибка таймаута подключения или ответа сервиса CommunicationException - ошибка на уровне транспорта
Inheritance: BaseClient, IExchangeServiceClient
示例#1
0
        private static void Main(string[] args)
        {
            // публичный адрес подключения к SOAP сервису
            var url = "https://service.synerdocs.ru/exchangeservice.svc";
            // необязательный параметр - идентификатор клиентского приложения,
            // может использоваться при авторизации для различения подключений с разных клиентов
            var appId = new Guid().ToString();
            var login = "******";
            var password = "******";

            var client = new Client(url, false, false, "", "WSHttpsBinding_IExchangeService");

            // авторизуемся по логину и паролю, получаем токен
            if (client.Authenticate(login, password, appId))
            {
                Console.WriteLine("Успешная авторизация по логину и паролю, получен токен:");
                Console.WriteLine(client.Token);
            }
            else
            {
                Console.WriteLine("Ошибка авторизации, неверный логин или пароль?");
            }

            var filesDir = "../../../../..";
            // путь до файла сертификата БЕЗ закртытого ключа
            var certificatePath = filesDir + "/Certificates/certificate.crt";
            if (!File.Exists(certificatePath))
            {
                Console.WriteLine("Файл сертификата не был найден по пути: \n {0} \n. " +
                                  "Для работы необходимо наличие файла сертификата по указанному пути.\n" +
                                  "Для получения сертификата обратитесь в техническую поддержку", certificatePath);
                Console.ReadLine();
                return;
            }

            // бинарное содержимое сертификата
            var certificateBytes = File.ReadAllBytes(certificatePath);
            // получим сертификат для входа по сертификату БЕЗ возможности подписания, т.к. в certificate при таком способе
            // фактически - это структура данных с отобржаением свойств сертификата
            // ! для создания подписей необходимо получить сертификат из локального хранилища по другому (см. Samples.SendDocument)
            var certificate = new X509Certificate2(certificateBytes);

            // авторизуемся по сертификату
            if (client.AuthenticateWithCertificate(certificate.Thumbprint, appId))
            {
                Console.WriteLine("Успешная авторизация по сертификату, получен токен:");
                Console.WriteLine(client.Token);
            }
            else
            {
                Console.WriteLine("Ошибка авторизации по сертификату");
            }

            Console.WriteLine("Для выхода нажмите enter");
            Console.ReadLine();
        }
示例#2
0
        private static void Main(string[] args)
        {
            var url = "https://service.synerdocs.ru/exchangeservice.svc";
            var appId = new Guid().ToString();
            var login = "******";
            var password = "******";

            var client = new Client(url, false, false, "", "WSHttpsBinding_IExchangeService");

            // авторизуемся по логину и паролю, получаем токен
            if (client.Authenticate(login, password, appId))
            {
                Console.WriteLine("Успешная авторизация по логину и паролю, получен токен:");
                Console.WriteLine(client.Token);
            }
            else
            {
                Console.WriteLine("Ошибка авторизации, неверный логин или пароль?");
            }

            var boxInfo = client.GetBoxes().FirstOrDefault();
            if (boxInfo == null)
            {
                Console.WriteLine("Ошибка при получении ящиков");
                return;
            }
            // текущий ящик == наш ящик
            var currentBox = boxInfo.Address;

            Console.WriteLine(currentBox);

            // получаем список исходящих документов
            var docs = client.GetDocumentList(new DocumentListOptions
            {
                // ! для того, чтобы выбрать входящие документы, необходимо указать в поле BoxTo - наш ящик
                BoxTo = null,
                // отправленных от нашего ящика
                BoxFrom = currentBox,
                // начать с этого индекса для постраничной выборки элементов
                First = 0,
                // кол-во элементов на странице
                Max = 10
            });

            Console.WriteLine(docs.Total);
            foreach (var doc in docs.Items)
                Console.WriteLine(doc.Name);

            Console.WriteLine("Для выхода нажмите enter");
            Console.ReadLine();
        }
示例#3
0
        /// <summary>
        /// Пример авторизации по сертификату
        /// получение данных по ИНН об организации-получателе
        /// отправка документа с подписью сертификатом пользователя
        /// отправка документ без подписания
        /// </summary>
        /// <param name="args"></param>
        private static void Main(string[] args)
        {
            var url = "https://service.synerdocs.ru/exchangeservice.svc";
            var appId = new Guid().ToString();

            var client = new Client(url, false, false, "", "WSHttpsBinding_IExchangeService");

            // авторизация по логину и паролю (тут возможно использовать также
            // авторизацию по сертификату при необходимости)
            var login = "******";
            var password = "******";
            if (client.Authenticate(login, password))
            {
                Console.WriteLine("Успешная авторизация, получен токен:");
                Console.WriteLine(client.Token);
            }
            else
            {
                Console.WriteLine("Ошибка авторизации");
                Console.ReadKey();
                return;
            }

            // получение текущего ящика
            var currentBoxInfo = client.GetBoxes().FirstOrDefault();
            if (currentBoxInfo == null)
            {
                Console.WriteLine("Ошибка при получении ящиков");
                return;
            }
            // выбор текущего ящика - от него будем отправлять документы
            // в простом случае - у пользователя доступен только один ящик
            // а если пользователь состоит в нескольких организациях - ящиков может быть несколько
            var currentBox = currentBoxInfo.Address;

            // ранее сохраненный или полученный ИД документа внутри сообщения, доступного для текущего авторизованного пользователя:

            // ИД документа - может быть и в формате "50008423799c4c82944b5b82c38be02e"
            var documentId = "50008423-799c-4c82-944b-5b82c38be02e";

            try
            {
                // получение тела (бинарного содержимого) документа
                var documentContent = client.GetDocumentContent(currentBox, documentId);
                Console.WriteLine("Получено содержимое документа NBytes=" + documentContent.Length);

                // запрос информации о документе с указаним того, какую информацию необходимо получить
                var docInfo = client.GetFullDocumentInfo(currentBox, documentId, new FullDocumentInfoRequestParams
                {
                    GetCard = true,
                    GetContent = false,
                    GetRelatedDocuments = true,
                    GetServiceDocuments = true,
                    GetSigns = true
                });
                if (docInfo != null)
                {
                    Console.WriteLine("Получена информация о документе");

                    // получении информации о сообщении документооборота, в которое входит документ
                    var messageId = docInfo.MessageId;
                    var message = client.GetMessage(currentBox, messageId);
                    if (message != null)
                        Console.WriteLine("Получена информации о сообщении документооборота");
                }

                // получение полной информации о документе включая информацию документооборотам и вхождениям,
                // с указаним того, какую информацию необходимо получить
                // результат метода дублирует информацию, которую можно получать из других методов API
                // например информацию о подписях и т.д.
                var flowDocumentInfo = client.GetFlowDocumentInfo(currentBox, documentId,
                    new FlowDocumentInfoRequestParams
                    {
                        GetSigns = true,
                        GetServiceDocuments = true,
                        GetRelatedDocuments = true,
                        FlowResult = DocumentFlowResultMode.FullInfo
                    });
                if (flowDocumentInfo != null)
                    Console.WriteLine("Получена информация о документе с докуметооборотами");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Произошла ошибка" + ex.GetType() + "   " + ex.Message);
                Console.ReadKey();
                return;
            }

            Console.WriteLine("Для выхода нажмите enter");
            Console.ReadLine();
        }
示例#4
0
        /// <summary>
        /// Пример авторизации по сертификату
        /// получение данных по ИНН об организации-получателе
        /// отправка документа с подписью сертификатом пользователя
        /// отправка документов без подписания
        /// 
        /// отправка идет так:
        /// 
        /// сообщение1 - получателю1 без указания подразления
        ///   документ1
        ///   документ2
        /// </summary>
        /// <param name="args"></param>
        private static void Main(string[] args)
        {
            var url = "https://service.synerdocs.ru/exchangeservice.svc";
            var client = new Client(url, false, false, "", "WSHttpsBinding_IExchangeService");

            // авторизация по логину и паролю (тут возможно использовать также
            // авторизацию по сертификату при необходимости)
            var login = "******";
            var password = "******";
            if (client.Authenticate(login, password))
            {
                Console.WriteLine("Успешная авторизация, получен токен:");
                Console.WriteLine(client.Token);
            }
            else
            {
                Console.WriteLine("Ошибка авторизации");
                Console.ReadKey();
                return;
            }

            // получение текущего ящика
            var currentBoxInfo = client.GetBoxes().FirstOrDefault();
            if (currentBoxInfo == null)
            {
                Console.WriteLine("Ошибка при получении ящиков");
                return;
            }
            // выбор текущего ящика - от него будем отправлять документы
            // в простом случае - у пользователя доступен только один ящик
            // а если пользователь состоит в нескольких организациях - ящиков может быть несколько
            var currentBox = currentBoxInfo.Address;

            // ИНН организации-получателя
            var inn = "1839839970";
            // пусть не знаем КПП, при пустом значении - должно автоматически быть получено головное
            // при получении списка организации
            var kpp = "";

            // поиск организации получателя по атрибутам
            var organizations = client.GetOrganizationListByInnKpp(inn, kpp);

            // отладочный вывод некоторой информации о найденных организациях
            Console.WriteLine("Организации - получатели:");
            foreach (var organization in organizations)
                Console.WriteLine(organization.Name);

            // создание списка получателей документов в сообщении
            var messageRecipients = organizations.Select(x =>
                new MessageRecipient
                {
                    // ящик получателя, при этом автоматически будет выбрано головное подразделение,
                    // т.к. явно не указали подразделение
                    OrganizationBoxId = x.BoxAddress
                }).ToList();

            // добавление еще одного получателя:
            // выбор по определенному КПП подразделения организации - получателя
            var moreRecipientKpp = "243456789";
            var moreRecipient = client.GetOrganizationByInnKpp("1839840035", null);

            // вывод некоторой инфомрации о найденном получателе:
            Console.WriteLine("Организация - дополнительный получатель:");
            Console.WriteLine(moreRecipient.Name);

            // получим все подразделения организации и выберем нужное по КПП
            // в параметр метода передается текущий выбранный ящик
            var departments = client.GetOrganizationStructure(currentBox, moreRecipient.OrganizationId);
            var moreRecipientDepartment = departments.FirstOrDefault(x => x.Kpp == moreRecipientKpp);
            if (moreRecipientDepartment == null)
            {
                Console.WriteLine("Не удалось найти подразделение организации - дополительного получателя по КПП - " +
                                  moreRecipientKpp);
                return;
            }

            // ! т.к. Отправка документов без подписи нескольким контрагентам невозможна,
            // поэтому каждый из списков получателей содержим только одного получателя

            // Но например при отправке документов с подписью возможно отправлять документы сразу нескольких получателям

            // Пример указания определенного подразделения организации - получателя:
            // добавим полученную информацию о подразделении получателя в нужный список получателей
            var messageRecipientsWithDepartments = new List<MessageRecipient>
            {
                new MessageRecipient
                {
                    // ящик организации - получателя
                    OrganizationBoxId = moreRecipient.BoxAddress,
                    // ИД подразделения организации - получателя (необязательный параметр)
                    DepartmentId = moreRecipientDepartment.Id
                }
            };

            // содержимое неформализованного документа из файла на локальном компьютере
            var filesDir = "../../../../..";
            var filePath = filesDir + "/Documents/Untyped 3.txt";
            var fileBytes = File.ReadAllBytes(filePath);

            // Пример создание документов:
            // созданный объект - документ можно использовать при отправке в сообщениях
            // только 1 раз, т.к. поля должны быть уникальными
            var document1 = new Document
            {
                Id = Guid.NewGuid().ToString(),
                DocumentType = DocumentType.Untyped,
                UntypedKind = null,
                FileName = "Отправка без подписи - первый документ1 - " + Path.GetFileName(filePath),
                Content = fileBytes,
                Card = null,
                NeedSign = false
            };
            // создание 2го документа
            var document2 = new Document
            {
                Id = Guid.NewGuid().ToString(),
                DocumentType = DocumentType.Untyped,
                UntypedKind = null,
                FileName = "Отправка без подписи - второй документ2 - " + Path.GetFileName(filePath),
                Content = fileBytes,
                Card = null,
                NeedSign = false
            };

            // создаем сообщение для отправки
            var unsignedMessage = new UnsignedMessage
            {
                From = currentBox,
                // документы в сообщение
                Documents = new[]
                {
                    document1,
                    document2
                },
                // получатели
                Recipients = messageRecipients.ToArray()
            };

            // создаем сообщение для отправки по второму списку получателей - для примера c указанием подразделений
            // создание 3го документа
            var document3 = new Document
            {
                // для исключения дублирования ID документов - всегда необходимо создание уникальных идентификаторов документов
                Id = Guid.NewGuid().ToString(),
                DocumentType = DocumentType.Untyped,
                UntypedKind = null,
                FileName = "Отправка без подписи - первый документ3 - " + Path.GetFileName(filePath),
                Content = fileBytes,
                Card = null,
                NeedSign = false
            };
            // создание 4го документа
            var document4 = new Document
            {
                Id = Guid.NewGuid().ToString(),
                DocumentType = DocumentType.Untyped,
                UntypedKind = null,
                FileName = "Отправка без подписи - второй документ4 - " + Path.GetFileName(filePath),
                Content = fileBytes,
                Card = null,
                NeedSign = false
            };
            // создание 2го сообщения
            var unsignedMessage2 = new UnsignedMessage
            {
                From = currentBox,
                // документы в сообщение
                Documents = new[]
                {
                    document3,
                    document4
                },
                // получатели
                Recipients = messageRecipientsWithDepartments.ToArray()
            };
            // пример отправки двух сообщений с разными наборами получателей
            // отправляем сообщение 1
            SentMessage result1;
            try
            {
                result1 = client.SendUnsignedMessage(unsignedMessage);
                Console.WriteLine("Успешно отправлено исходящее сообщение с документами без подписи 1");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Ошибка при отправке сообщения 1" + ex.Message);
                Console.ReadKey();
                return;
            }
            // отправляем сообщение 2
            SentMessage result2;
            try
            {
                result2 = client.SendUnsignedMessage(unsignedMessage2);
                Console.WriteLine("Успешно отправлено исходящее сообщение с документами без подписи 2");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Ошибка при отправке сообщения 2" + ex.Message);
                Console.ReadKey();
                return;
            }
            Console.WriteLine("Успешно отправлено исходящее сообщения");

            Console.WriteLine("Для выхода нажмите enter");
            Console.ReadLine();
        }
示例#5
0
 public MessageFactory(Client client, string currentBox)
 {
     this.client = client;
     this.CurrentBox = currentBox;
 }
示例#6
0
        /// <summary>
        /// Пример авторизации по сертификату
        /// получение данных по ИНН об организации-получателе
        /// отправка документа с подписью сертификатом пользователя
        /// отправка документ без подписания
        /// </summary>
        /// <param name="args"></param>
        private static void Main(string[] args)
        {
            var url = "https://service.synerdocs.ru/exchangeservice.svc";
            var appId = new Guid().ToString();

            var client = new Client(url, false, false, "", "WSHttpsBinding_IExchangeService");

            // сертификат для входа по сертификату и подписания
            var certificate = TryInstallOrGetCertificate();
            if (certificate == null)
                return;

            Console.WriteLine("Успешно получен сертификат с отпечатком: " + certificate.Thumbprint);

            // авторизуемся по сертификату
            if (client.AuthenticateWithCertificate(certificate.Thumbprint, appId))
            {
                Console.WriteLine("Успешная авторизация по сертификату, получен токен:");
                Console.WriteLine(client.Token);
            }
            else
            {
                Console.WriteLine("Ошибка авторизации по сертификату");
            }

            // ИНН организации-получателя
            var inn = "1839839904";
            // не знаем КПП, при пустом значении - должно найти головное подразделение организации
            var kpp = "";

            // поиск организации получателя по атрибутам
            var organizations = client.GetOrganizationListByInnKpp(inn, kpp);
            foreach (var organization in organizations)
                Console.WriteLine(organization.Name);

            // получаем содержимое неформализованного документа из файла на локальном компьютере
            var filesDir = "../../../../..";
            // пример подписи файлов с локального компьютера
            var filePath = filesDir + "/Documents/Untyped 3.txt";
            var filePath2 = filesDir + "/Documents/Untyped 1.png";
            var fileBytes = File.ReadAllBytes(filePath);
            var fileBytes2 = File.ReadAllBytes(filePath2);
            // создание подписей к бинарному содержимому файлов, подписание с помощью выбранного ранее сертификата
            var signature = CryptoApiHelper.Sign(certificate, fileBytes, true);
            var signature2 = CryptoApiHelper.Sign(certificate, fileBytes2, true);

            // получение текущего ящика
            var boxInfo = client.GetBoxes().FirstOrDefault();
            if (boxInfo == null)
            {
                Console.WriteLine("Ошибка при получении ящиков");
                return;
            }
            var currentBox = boxInfo.Address;

            // создание документа
            var document = new Document
            {
                Id = Guid.NewGuid().ToString(),
                DocumentType = DocumentType.Untyped,
                UntypedKind = null,
                FileName = Path.GetFileName(filePath),
                Content = fileBytes,
                Card = null,
                NeedSign = false
            };
            // создание еще одного документа (опционально)
            var document2 = new Document
            {
                Id = Guid.NewGuid().ToString(),
                DocumentType = DocumentType.Untyped,
                UntypedKind = null,
                FileName = Path.GetFileName(filePath2),
                Content = fileBytes2,
                Card = null,
                NeedSign = false
            };

            // создаем сообщение для отправки
            var message = new Message
            {
                // генерируем уникальный идентификатор для сообщения
                Id = Guid.NewGuid().ToString(),
                // указываем свой текущий ящик (ящик отправителя)
                From = currentBox,
                // документы
                Documents = new[]
                {
                    document,
                    document2
                },
                // получатели
                Recipients = organizations.Select(x =>
                    new MessageRecipient
                    {
                        OrganizationBoxId = x.BoxAddress
                    }).ToArray(),
                // прикрепляем подписи
                Signs = new[]
                {
                    new Sign
                    {
                        Id = Guid.NewGuid().ToString(),
                        DocumentId = document.Id,
                        Raw = signature
                    },
                    new Sign
                    {
                        Id = Guid.NewGuid().ToString(),
                        DocumentId = document2.Id,
                        Raw = signature2
                    }
                }
            };
            SentMessage result;
            try
            {
                result = client.SendMessage(message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Ошибка при отправке документов: " + ex.Message);
                Console.ReadKey();
                return;
            }
            Console.WriteLine("Успешно отправлено исходящее сообщение MessageId = {0}", result.MessageId);

            Console.WriteLine("Для выхода нажмите enter");
            Console.ReadLine();
        }
示例#7
0
        /// <summary>
        /// Обработка запуска консольного приложения с параметрами командной строки
        /// </summary>
        /// <param name="args">аргументы \ параметры запуска из командной строки</param>
        public void Run(string[] args)
        {
            var url = args[0];

            // Выбор нужной конечной точки в клиенте для возможности подключения по URL как по http, так и по https
            var configEndpointName = url.StartsWith("https")
                ? "WSHttpsBinding_IExchangeService"
                : "WSHttpBinding_IExchangeService";

            // принять url
            var client = new Client(url, false, false, _applicationVersion, configEndpointName);

            try
            {
                _context = new ClientContext
                {
                    ServiceClient = client
                };

                // аутентификация
                Auth(client);

                // следующие команды ...
                var commandsMap = new Dictionary<string, Tuple<Action, string>>
                {
                    {"get-boxes", Tuple.Create<Action,string>(Boxes, "Показать список ящиков")} ,
                    {"set-box", Tuple.Create<Action,string>(SetBox, "Выбрать ящик")} ,
                    {"load-messages", Tuple.Create<Action,string>(LoadMessages, "Загрузить и обработать входящие сообщения")},
                    {"send-docs", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentSigned), "Отправить документы")},
                    {"send-unsigned", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentUnsigned), "Отправить документы без подписи")},
                    {"send-forward", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentForward), "Переслать документы")},
                    {"send-internal", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentInternal), "Отправить документы подразделению")},
                    {"sign-document", Tuple.Create<Action,string>(SignDocument, "Подписать документ")},
                    {"reject-sign", Tuple.Create<Action,string>(RejectSign, "Отказать в подписании документа")},
                    {"move-docs", Tuple.Create<Action,string>(MoveDocuments, "Переместить документы в подразделение")},
                    {"get-doc-entries", Tuple.Create<Action,string>(GetDocumentEntries, "Список вхождений документов")},
                    {"get-doc-inner", Tuple.Create<Action,string>(GetInternalDocuments, "Список внутренних документов")},
                    {"get-doc-list", Tuple.Create<Action,string>(GetDocumentList, "Список документов")},
                    {"get-doc-info", Tuple.Create<Action,string>(GetDocumentInfo, "Загрузить документ")},
                    {"get-doc-flow", Tuple.Create<Action,string>(GetDocumentFlow, "Загрузить документ c вхождениями")},
                    {"get-draft-list", Tuple.Create<Action,string>(GetDraftMessageList, "Список черновиков")},
                    {"get-draft", Tuple.Create<Action,string>(GetDraftMessage, "Загрузить черновик")},
                    {"del-draft", Tuple.Create<Action,string>(DeleteDraftMessage, "Удалить черновик")},
                    {"get-contacts", Tuple.Create<Action,string>(GetActiveContacts, "Список активных контактов")},
                    {"del-contact", Tuple.Create<Action,string>(DeleteContact, "Удалить контакт")},
                    {"get-structure", Tuple.Create<Action,string>(GetOrganizationStructure, "Дерево орг.структуры")},
                    {"add-department", Tuple.Create<Action,string>(AddOrganizationStructureElement, "Добавить подразделение")},
                    {"edit-department", Tuple.Create<Action,string>(EditOrganizationStructureElement, "Изменить подразделение")},
                    {"del-department", Tuple.Create<Action,string>(DeleteOrganizationStructureElement, "Удалить подразделение")},
                    {"accept-reg", Tuple.Create<Action,string>(AcceptRegulation, "Принять Правила Synerdocs")},
                    {"add-doc-tag", Tuple.Create<Action,string>(AddDocumentTag, "Создать дополнительный статус(тэг) к документу")},
                    {"del-doc-tag", Tuple.Create<Action,string>(DeleteDocumentTag, "Удалить дополнительный статус(тэг), прикрепленный к документу")},
                    {"get-doc-tag", Tuple.Create<Action,string>(GetDocumentTag, "Показать информацию по дополнительному статусу(тэгу)")},
                    {"add-promocode", Tuple.Create<Action,string>(AddOrganizationPromoCode, "Добавить промокод в организацию")},
                    {"get-promocode-list", Tuple.Create<Action,string>(GetOrganizationPromoCodeList, "Список промокодов организации")},
                    {"get-promocode", Tuple.Create<Action,string>(GetPromoCodeByName, "Получить промокод")},
                    {"del-promocode", Tuple.Create<Action,string>(DeleteOrganizationPromoCode, "Удалить промокод")},
                    {"get-messages-without-content", Tuple.Create<Action,string>(GetMessagesWithoutDocumentsSignsContent,
                                            "Загрузить входящие сообщения без содержимого документов и подписей")},
                    {"send-revocation-offer", Tuple.Create<Action,string>(SendRevocationOffer, "Отправить ПОА")},
                    {"send-statement", Tuple.Create<Action,string>(SendStatementOfInvoiceReglament, "Отправить заявление об участии в ЭДО СФ")},
                    {"download-flow", Tuple.Create<Action,string>(DownloadDocumentFlowArchive, "Скачать документооборот в архиве")},
                    {"parse-document", Tuple.Create<Action,string>(TryParseDocumentContentFromFile, "Распарсить документ")},
                    {"download-pdf", Tuple.Create<Action,string>(DownloadPdfDocument, "Скачать документ в формате pdf")},
                };

                PrintAvailableCommnads(commandsMap);

                // выбираем первый доступный ящик
                var firstAvailableBox = client.GetBoxes().FirstOrDefault();
                if (firstAvailableBox == null)
                {
                    throw new InvalidOperationException("У пользователя нет доступа ни к одному ящику");
                }
                _context.CurrentBox = firstAvailableBox.Address;
                _context.CurrentOrganizationId = firstAvailableBox.OrganizationId;
                _context.LoadLastProcessedMessageId();
                _context.MessageFactory = new MessageFactory(_context.ServiceClient, _context.CurrentBox);

                if (string.IsNullOrWhiteSpace(_context.Login))
                {
                    var userInfo = client.GetUserInfo(_context.CurrentBox);
                    _context.Login = userInfo.Login;
                }

                while (true)
                {
                    UserInput.Write(ConsoleColor.White, ">");
                    var line = UserInput.ReadLine();
                    if (commandsMap.ContainsKey(line))
                    {
                        try
                        {
                            commandsMap[line].Item1();
                        }
                        catch (InputCanceledException)
                        {
                            Console.Out.WriteLine("Команда прервана");
                        }
                        catch (Exception ex)
                        {
                            UserInput.Error("При выполнении команды произошла неожиданная ошибка");
                            UserInput.Error(ex.ToString());
                        }
                    }
                    else
                    {
                        UserInput.Error("Неправильно указано имя команды \"{0}\"", line);
                        PrintAvailableCommnads(commandsMap);
                    }
                }

                // интерактивная консоль для ввода

                // ввод значений списочных параметров по номерам
                // > auth
                // выберите сертификат
                // [email protected] [1]
                // [email protected] [2]
                // Сертификат [1]>
                //
                // Подтверждения
                // Отправить файлы? [Y/n]>
            }
            catch (InputCanceledException)
            {
                // Ctrl+C
                Console.Out.WriteLine();
                Console.Out.WriteLine("Выход");
            }
            catch (Exception ex)
            {
                UserInput.Error("Произошла неожиданная ошибка");
                UserInput.Error(ex.ToString());
            }
        }
示例#8
0
        /// <summary>
        /// Авторизоваться
        /// </summary>
        /// <param name="client"></param>
        private void Auth(Client client)
        {
            var byCertificate = new UserInput.Option("1", "По сертификату", true);
            var byPassword = new UserInput.Option("2", "По паролю", false);
            var register = new UserInput.Option("3", "Зарегистрироваться в сервисе", false);

            while (true)
            {
                var authOption = UserInput.ChooseOption("Выберите способ аутентификации", new[]
                                                                    {
                                                                        byCertificate,
                                                                        byPassword,
                                                                        register
                                                                    });

                if (authOption == byPassword)
                {
                    var login = UserInput.ReadParameter("имя пользователя");
                    var password = UserInput.ReadParameter("пароль");

                    try
                    {
                        if (client.Authenticate(login, password, _applicationId))
                        {
                            UserInput.Success("Аутентификация прошла успешно");
                            _context.Login = login;
                            return;
                        }
                        UserInput.Error("Неправильный логин или пароль");
                    }
                    catch (Exception ex)
                    {
                        UserInput.Error("Произошла неожиданная ошибка");
                        UserInput.Error(ex.ToString());
                    }
                }
                else if (authOption == byCertificate)
                {
                    try
                    {
                        // выбор сертификата по списку
                        ChooseCertificate();
                        if (client.AuthenticateWithCertificate(_context.Certificate.Thumbprint, _applicationId))
                        {
                            UserInput.Success("Аутентификация прошла успешно");
                            return;
                        }
                        UserInput.Error("Аутентификация не пройдена");
                    }
                    catch (Win32Exception win32Ex)
                    {
                        UserInput.Error("Произошла ошибка при попытке расшифровать токен");
                        UserInput.Error(win32Ex.ToString());
                    }
                    catch (Exception ex)
                    {
                        UserInput.Error("Произошла неожиданная ошибка");
                        UserInput.Error(ex.ToString());
                    }
                }
                else
                {
                    try
                    {
                        var registerResult = Register();

                        if (registerResult.Success)
                        {
                            client.Authenticate(registerResult.RegisterModel.Login,
                                registerResult.RegisterModel.Password, _applicationId);
                        }

                        return;
                    }
                    catch (Exception ex)
                    {
                        UserInput.Error("Произошла неожиданная ошибка");
                        UserInput.Error(ex.ToString());
                    }
                }
            }
        }
示例#9
0
        /*

         Пример демонстрирует:
         * [+] авторизация по логину паролю
         * [+] авторизация по сертификату
         * [+] отправка подписанного НД
         * [+] подписание НД
         * [+] отказ от подписи под НД
         * [+] отправка ИОД для НД
         * [+] прием СД для НД (ИОП, УОУ, Подпись)
         * [+] отправка ЭСФ
         * [+] отправка СД для ЭСФ
         * [+] прием СД для ЭСФ
         * [+] работа с черновиками сообщений
         * [-] работа с контактами
         * [+] отправка нескольких документов
         * [+] обработка ошибок
         * [-] SSL
         * [+] загрузка большого документа (>1Мб)
         * [-] повторная отправка сообщения
         * [+-] загрузка, сохранение документа и документооборота на диск
         * [+] отображение подписи входящего документа
        */
        public void Run(string[] args)
        {
            var url = args[0];

            // Выбор нужной конечной точки в клиенте, т.к. конфиг не позволяет задать это одновременно простым способом
            // нужно, чтобы можно было заходить как по http, так и по https через консольный клиент
            // Bug 7733:В консольном клиенте не работает авторизация
            var configEndpointName = url.StartsWith("https") ?
                "WSHttpsBinding_IExchangeService" :
                "WSHttpBinding_IExchangeService";

            // принять url
            var client = new Client(url, enableTracing: false, useStreamRequest: false, configEndpointName: configEndpointName);

            try
            {
                context = new ClientContext
                {
                    ServiceClient = client,
                    //MessageFactory = new MessageFactory(client)
                };

                // аутентификация
                Auth(client);

                // следующие команды ...
                var commandsMap = new Dictionary<string, Tuple<Action, string>>()
                {
                    {"get-boxes", Tuple.Create<Action,string>(Boxes, "Показать список ящиков")} ,
                    {"set-box", Tuple.Create<Action,string>(SetBox, "Выбрать ящик")} ,
                    {"load-messages", Tuple.Create<Action,string>(LoadMessages, "Загрузить и обработать входящие сообщения")},
                    {"send-docs", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentSigned), "Отправить документы")},
                    {"send-unsigned", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentUnsigned), "Отправить документы без подписи")},
                    {"send-forward", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentForward), "Переслать документы")},
                    {"send-internal", Tuple.Create<Action,string>(() => SendDocuments(FlowType.SentInternal), "Отправить документы подразделению")},
                    {"sign-document", Tuple.Create<Action,string>(SignDocument, "Подписать документ")},
                    {"reject-sign", Tuple.Create<Action,string>(RejectSign, "Отказать в подписании документа")},
                    {"move-docs", Tuple.Create<Action,string>(MoveDocuments, "Переместить документы в подразделение")},
                    {"get-doc-entries", Tuple.Create<Action,string>(GetDocumentEntries, "Список вхождений документов")},
                    {"get-doc-inner", Tuple.Create<Action,string>(GetInternalDocuments, "Список внутренних документов")},
                    {"get-doc-list", Tuple.Create<Action,string>(GetDocumentList, "Список документов")},
                    {"get-doc-info", Tuple.Create<Action,string>(GetDocumentInfo, "Загрузить документ")},
                    {"get-doc-flow", Tuple.Create<Action,string>(GetDocumentFlow, "Загрузить документ c вхождениями")},
                    {"get-draft-list", Tuple.Create<Action,string>(GetDraftMessageList, "Список черновиков")},
                    {"get-draft", Tuple.Create<Action,string>(GetDraftMessage, "Загрузить черновик")},
                    {"del-draft", Tuple.Create<Action,string>(DeleteDraftMessage, "Удалить черновик")},
                    {"get-contacts", Tuple.Create<Action,string>(GetActiveContacts, "Список активных контактов")},
                    {"del-contact", Tuple.Create<Action,string>(DeleteContact, "Удалить контакт")},
                    {"get-structure", Tuple.Create<Action,string>(GetOrganizationStructure, "Дерево орг.структуры")},
                    {"add-department", Tuple.Create<Action,string>(AddOrganizationStructureElement, "Добавить подразделение")},
                    {"edit-department", Tuple.Create<Action,string>(EditOrganizationStructureElement, "Изменить подразделение")},
                    {"del-department", Tuple.Create<Action,string>(DeleteOrganizationStructureElement, "Удалить подразделение")},
                    {"accept-reg", Tuple.Create<Action,string>(AcceptRegulation, "Принять Правила Synerdocs")},
                    // {"outmsg", OuntgoingMessages},
                };

                PrintAvailableCommnads(commandsMap);

                //
                // выбираем первый доступный ящик
                var firstAvailableBox = client.GetBoxes().FirstOrDefault();
                if (firstAvailableBox == null)
                {
                    throw new InvalidOperationException("У пользователя нет доступа ни к одному ящику");
                }
                context.CurrentBox = firstAvailableBox.Address;
                context.CurrentOrganizationId = firstAvailableBox.OrganizationId;
                context.LoadLastProcessedMessageId();
                context.MessageFactory = new MessageFactory(context.ServiceClient, context.CurrentBox);

                while (true)
                {
                    UserInput.Write(ConsoleColor.White, ">");
                    var line = UserInput.ReadLine();
                    if (commandsMap.ContainsKey(line))
                    {
                        try
                        {
                            commandsMap[line].Item1();
                        }
                        catch (InputCanceledException)
                        {
                            Console.Out.WriteLine("Команда прервана");
                            continue;
                        }
                        catch (Exception ex)
                        {
                            UserInput.Error("При выполнении команды произошла неожиданная ошибка");
                            UserInput.Error(ex.ToString());
                        }
                    }
                    else
                    {
                        UserInput.Error("Неправильно указано имя команды \"{0}\"", line);
                        PrintAvailableCommnads(commandsMap);
                    }
                }

                // интерактивная консоль для ввода

                // ввод значений списочных параметров по номерам
                // > auth
                // выберите сертификат
                // [email protected] [1]
                // [email protected] [2]
                // Сертификат [1]>
                //
                // Подтверждения
                // Отправить файлы? [Y/n]>
            }
            catch (InputCanceledException)
            {
                // Ctrl+C
                Console.Out.WriteLine();
                Console.Out.WriteLine("Выход");
            }
            catch (Exception ex)
            {
                UserInput.Error("Произошла неожиданная ошибка");
                UserInput.Error(ex.ToString());
            }
        }