Клиентский класс, реализующий логику работы с веб-сервисом 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.
Пример программного кода внешнего приложения:
[csharp]
// Выполнение аутентификации пользователя с имененем UserName.
if (BPMonlineProcessEngineExample.TryLogin("UserName", "UserPassword"))
{
try
{
// Добавление нового контакта через запуск бизнес-процесса в системе.
BPMonlineProcessEngineExample.AddContact("Коваленко Петр Андреевич", "123-23-65");
// Получение списка контактов через запуск бизнес-процесса в системе.
List bpmContacts =
BPMonlineProcessEngineExample.GetAllContacts();
// Обработка полученного списка контактов.
foreach (var contact in bpmContacts)
{
// Обработка данных контакта.
}
}
catch (Exception e)
{
// Обработка ошибок.
}
}
[/csharp]
Это нужно писать на стороне стороннего приложения?
А как оно будет понимимать к какому сайту оно обращается? Можна получить пример полного кода на стороне стороннего приложения?
Я добавил Исходный код. Назвал его BPMonlineProcessEngineExample. В него поместил код
[csharp]
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;
}
}
[/csharp]
Какие мои действия дальше? Как учесть этот мой код в запросе от стороннего приложения?
Николай,
для получения полноценного ответа, пожалуйста, сформулируйте и направьте Ваши вопросы в поддержку support@terrasoft.ru
Здравствуйте! У меня получилось отправлять данные из внешнего источника. Я таким образом создаю в системе новые контакты. И если я в БП передаю два параметры, то все занимает 2-3 секунды на обработку такого запроса. Но вот если я передаю 120 параметров и в БП сделал Создание контакта где эти поля присваьваю в контакт, то такой запрос выполняется только один раз в минуту. Тоисть за час я могу таким образом передать только 60 контактов. Можна как-то ускорить это дело? Спасибо!
![]()
Здравствуйте!
Элемент "Добавить данные" записывает данные через ESQ. Вы можете записывать данные напрямую в БД элементов "Задание-сценарий" (через CustomQuerry), но тогда:
- Права на записи не будут раздаваться (в случае администрирования по записям)
- Процессы, которые запускаются при создании контакта, запускаться не будут
Также для ускорения работы процесса Вы можете поставить признак "Принудительная компиляция" и после сохранения скомпилировать процесс. Данное действие также может ускорить выполнение процесса (теоретически).