Клиентский класс, реализующий логику работы с веб-сервисом ProcessEngineService.svc
Здравствуйте.
Пробую запускать процессы через веб-сервис как написано в http://academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/WorkWithBpm...
Делаю запрос об оплате счета. Он имеет вид https://mysystem.bpmonline.com/0/ServiceModel/ProcessEngineService.svc/C...
Если я делаю его со своего компа, то все работает. Если из друго приложения - нет.
Этот запрос мне нужно делать из стороннего приложения. И оно меня выбрасывает на страницу входа в систему.
В этой же статье есть Пример запуска бизнес-процессов bpm'online из внешнего приложения.
Но я не совсем понимаю всей картины.
Что именно мне нужно сделать? Подскажите пошагово, что и куда дописать?
Я так понимаю, что в этом запросе из стороннего приложения https://mysystem.bpmonline.com/0/ServiceModel/ProcessEngineService.svc/C...
я должен еще передавать логин и пароль на вход в систему?
где должен быть прописан программный код внешнего приложения?
Как и где я могу создать Клиентский класс, реализующий логику работы с веб-сервисом ProcessEngineService.svc? (типа BPMonlineProcessEngineExample) - я не понимаю куда его добавлять. Спасибо!
Нравится
Здравствуйте!
Для вызова сервиса нужно быть авторизированным пользователем системы. При вызове сервиса с приложения, используются auth-кука. При вызове сервиса с другого приложения Вы можете использовать Basic-аутентификацию.
Я так понимаю, мне достаточно перед этим запросом https://mysystem.bpmonline.com/0/ServiceModel/ProcessEngineService.svc/… сделать запрос аутентификации
http(s)://mysystem.bpmonline.com/ServiceModel/AuthService.svc/Login
и передать параметры
Content–Type: application/json
Authorization: Basic <Имя пользователя>:<Пароль пользователя>
в кодировке Base64?
и тогда все заработает? Или нет?
В данном случае, Вы будете использовать куки авторизации, при условии, что в последующих запросах будете передавать те куки, которые перешли в ответ на Ваш запрос.
Подробней об аутентификации Вы можете узнать перейдя по ссылке:
http://academy.terrasoft.ua/documents/docs/technic/SDK/7.7.0/RequestAut…
А можна более детальнее как мне передать те куки которые перешли в ответ на первый запрос в следующий запрос?
А по поводу статьи -
1) Добавьте в блок usings пространства имен System.IO и System.Net:
2) Создайте класс, в который добавьте следующие поля:
3) Добавьте в созданный класс метод для аутентификации через сервис AuthService.svc:
Вопрос: Куда я должен прописать этот код? Где и как создать этот класс? Спасибо.
Этот код Вам нужно добавить в Ваш класс, который вызывает сервис bpm'online и при первом запросе вызвать метод TryLogin с Вашим логином и паролем.
Если авторизация прошла успешно, то метод TryLogin вернет True, после этого при любом запросе к bpm'online передавать auth-куку.
Пример передачи куки:
// Включение использования cookie в запросе.
authRequest.CookieContainer = AuthCookie;
А как создать клас? (извините за тупой вопрос)
Конфигурация - Добавить - Исходный код? Или как?
Добрый день!
"Сергиенко Николай Петрович" написал:А как создать клас? (извините за тупой вопрос)
Конфигурация - Добавить - Исходный код? Или как?
Совершенно верно.
А Реализация запуска процессов в bpm'online из программного кода внешнего приложения
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/WorkWithBp…
Теперь для запуска процессов bpm'online из внешнего приложения достаточно реализовать вызов соответствующих методов класса BPMonlineProcessEngineExample.
Пример программного кода внешнего приложения:
// Выполнение аутентификации пользователя с имененем UserName. if (BPMonlineProcessEngineExample.TryLogin("UserName", "UserPassword")) { try { // Добавление нового контакта через запуск бизнес-процесса в системе. BPMonlineProcessEngineExample.AddContact("Коваленко Петр Андреевич", "123-23-65"); // Получение списка контактов через запуск бизнес-процесса в системе. List<BPMonlineProcessEngineExample.BPMContact> bpmContacts = BPMonlineProcessEngineExample.GetAllContacts(); // Обработка полученного списка контактов. foreach (var contact in bpmContacts) { // Обработка данных контакта. } } catch (Exception e) { // Обработка ошибок. } }
Это нужно писать на стороне стороннего приложения?
А как оно будет понимимать к какому сайту оно обращается? Можна получить пример полного кода на стороне стороннего приложения?
Я добавил Исходный код. Назвал его BPMonlineProcessEngineExample. В него поместил код
using System.IO; using System.Net; public class BPMonlineProcessEngineExample { private const string processServiceUri = "<адрес приложения bpm'online>/0/ServiceModel/ProcessEngineService.svc/"; private const string authServiceUri = "<адрес приложения bpm'online>/ServiceModel/AuthService.svc/Login"; // Cookie аутентификации bpm'online. private static CookieContainer AuthCookie = new CookieContainer(); // Признак, прошла ли аутентификация пользователя на сервере bpm'online. // Если аутентификация прошла успешно, в свойстве AuthCookie будут лежать // аутентификационные cookie, сформированные сервисом. public static bool IsAuthentificated { get { return (AuthCookie != null); } } // Метод для аутентификации запроса к веб-сервису bpm'online. // Параметры: // userName - имя пользователя bpm'online, // userPassword - пароль пользователя bpm'online. public static bool TryLogin(string userName, string userPassword) { // Создание экземпляра запроса к сервису аутентификации. var authRequest = HttpWebRequest.Create(authServiceUri) as HttpWebRequest; // Определение метода запроса. authRequest.Method = "POST"; // Определение типа контента запроса. authRequest.ContentType = "application/json"; // Включение использования cookie в запросе. authRequest.CookieContainer = AuthCookie; // Помещение в тело запроса учетной информации пользователя. using (var requesrStream = authRequest.GetRequestStream()) { using (var writer = new StreamWriter(requesrStream)) { writer.Write(@"{ ""UserName"":""" + userName + @""", ""UserPassword"":""" + userPassword + @""" }"); } } using (var response = (HttpWebResponse)authRequest.GetResponse()) { if (AuthCookie.Count > 0) { return true; } } return false; } // Метод запускает процесс ChangeOrderStatus, который меняет статус оплаты. // Процессу в качестве входящих параметров передаются номер заказа и Email. public static bool ChangeOrderStatus(string OrderId, string Email) { // Проверка, была ли выполнена аутентификация пользователя. if (!IsAuthentificated) { return false; } // Формирование строки запроса к веб-сервису для запуска процесса AddNewExternalContact, // которому передаются значения входящих параметров ContactName и ContactPhone. string requestString = string.Format(processServiceUri + "ChangeOrderStatus/Execute?OrderId={0}&Email={1}", OrderId, Email); HttpWebRequest request = HttpWebRequest.Create(requestString) as HttpWebRequest; // Определение метода запроса. request.Method = "GET"; // В запрос включаются аутентификационные cookie, которые были получены от // сервиса аутентификации bpm'online. request.CookieContainer = AuthCookie; // Получение ответа от сервиса и обработка результатов. using (var response = request.GetResponse()) { // Обработка результатов выполнения запроса. } return true; } }
Какие мои действия дальше? Как учесть этот мой код в запросе от стороннего приложения?
Николай,
для получения полноценного ответа, пожалуйста, сформулируйте и направьте Ваши вопросы в поддержку support@terrasoft.ru
Здравствуйте! У меня получилось отправлять данные из внешнего источника. Я таким образом создаю в системе новые контакты. И если я в БП передаю два параметры, то все занимает 2-3 секунды на обработку такого запроса. Но вот если я передаю 120 параметров и в БП сделал Создание контакта где эти поля присваьваю в контакт, то такой запрос выполняется только один раз в минуту. Тоисть за час я могу таким образом передать только 60 контактов. Можна как-то ускорить это дело? Спасибо!
Здравствуйте!
Элемент "Добавить данные" записывает данные через ESQ. Вы можете записывать данные напрямую в БД элементов "Задание-сценарий" (через CustomQuerry), но тогда:
- Права на записи не будут раздаваться (в случае администрирования по записям)
- Процессы, которые запускаются при создании контакта, запускаться не будут
Также для ускорения работы процесса Вы можете поставить признак "Принудительная компиляция" и после сохранения скомпилировать процесс. Данное действие также может ускорить выполнение процесса (теоретически).