Клиентский класс, реализующий логику работы с веб-сервисом 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) - я не понимаю куда его добавлять. Спасибо!

Нравится

13 комментариев

Здравствуйте!

Для вызова сервиса нужно быть авторизированным пользователем системы. При вызове сервиса с приложения, используются 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), но тогда:

  1. Права на записи не будут раздаваться (в случае администрирования по записям)
  2. Процессы, которые запускаются при создании контакта, запускаться не будут

Также для ускорения работы процесса Вы можете поставить признак "Принудительная компиляция" и после сохранения скомпилировать процесс. Данное действие также может ускорить выполнение процесса (теоретически).

Принудительна компиляция помогла. Спасибо!

Показать все комментарии