Creatio development guide
PDF
Это документация Creatio версии 7.16.0. Мы рекомендуем использовать новую версию документации.

Создание анонимного веб-сервиса

Glossary Item Box

Описание примера

Создать анонимный веб-сервис, возвращающий идентификатор контакта по предоставленному имени. Если найденных контактов несколько, то необходимо возвратить идентификатор только первого найденного контакта. Если контакт не найден, сервис должен вернуть пустую строку.

В качестве конфигурационного веб-сервиса можно использовать сервис, созданный на основе примера, описанного в статье "Создание пользовательского конфигурационного сервиса".

Алгоритм реализации примера

1. Создать конфигурационный сервис

Как создать конфигурационный сервис, читайте в статье "Создание пользовательского конфигурационного сервиса".

Поскольку создается анонимный конфигурационный сервис, то следует использовать системное подключение SystemUserConnection вместо пользовательского.

Для обеспечения работоспособности бизнес-процессов при работе с Entity из анонимного веб-сервиса, после получения SystemUserConnection, необходимо вызвать метод SessionHelper.SpecifyWebOperationIdentity пространства имён Terrasoft.Web.Common:

Terrasoft.Web.Common.SessionHelper.SpecifyWebOperationIdentity(HttpContextAccessor.GetInstance(), SystemUserConnection.CurrentUser);

Данный метод позволяет указать пользователя, от имени которого будет выполняется обработка данного http-запроса.

Исходный код конфигурационного сервиса, использующего системное пользовательское подключение:

// Пользовательское пространство имен.
namespace Terrasoft.Configuration.UsrCustomConfigurationService

{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using Terrasoft.Core;
    using Terrasoft.Web.Common;
    using Terrasoft.Core.Entities; 

    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class UsrCustomConfigurationService: BaseService
    {
        // Ссылка на экземпляр UserConnection, требуемый для обращения к базе данных.
        private SystemUserConnection _systemUserConnection;
        private SystemUserConnection SystemUserConnection {
            get {
                return _systemUserConnection ?? (_systemUserConnection = (SystemUserConnection)AppConnection.SystemUserConnection);
            }
        }
        
        // Метод, возвращающий идентификатор контакта по его имени.
        [OperationContract]
        [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public string GetContactIdByName(string Name){
            // Указывается пользователь, от имени которого выполняется обработка данного http запроса.
            SessionHelper.SpecifyWebOperationIdentity(HttpContextAccessor.GetInstance(), SystemUserConnection.CurrentUser);
            // Результат по умолчанию.
            var result = "";
            // Экземпляр EntitySchemaQuery, обращающийся в таблицу Contact базы данных.
            var esq = new EntitySchemaQuery(SystemUserConnection.EntitySchemaManager, "Contact");
            // Добавление колонок в запрос.
            var colId = esq.AddColumn("Id");
            var colName = esq.AddColumn("Name");
            // Фильтрация данных запроса.
            var esqFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", Name);
            esq.Filters.Add(esqFilter);
            // Получение результата запроса.
            var entities = esq.GetEntityCollection(SystemUserConnection);
            // Если данные получены.
            if (entities.Count > 0)
            {
                // Возвратить значение колонки "Id" первой записи результата запроса.
                result = entities[0].GetColumnValue(colId.Name).ToString();
                // Также можно использовать такой вариант:
                // result = entities[0].GetTypedColumnValue<string>(colId.Name);
            }
            // Возвратить результат.
            return result;
        }
    }
}

2. Зарегистрировать WCF-сервис

Для этого в каталоге ..\Terrasoft.WebApp\ServiceModel создайте файл UsrCustomConfigurationService.svc и добавьте в него следующую запись:

<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.UsrCustomConfigurationService.UsrCustomConfigurationService" %>

Здесь в атрибуте Service указывается полное имя класса конфигурационного сервиса. Подробнее о WCF-директиве @ServiceHost читайте в документации Microsoft.

3. Сконфигурировать WCF-сервис для протоколов http и https

Для этого необходимо в файлах services.config, расположенных в каталогах ..\Terrasoft.WebApp\ServiceModel\http и ..\Terrasoft.WebApp\ServiceModel\https добавить следующую запись

<services>
    ...
    <service name="Terrasoft.Configuration.[Service name]">
        <endpoint name="[Service name]EndPoint"
            address=""
            binding="webHttpBinding"
            behaviorConfiguration="RestServiceBehavior"
            bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
            contract="Terrasoft.Configuration.[Service name]" />
    </service>
</services>

Здесь выполняется конфигурирование сервиса. Элемент <services> содержит перечень конфигураций всех сервисов приложения (вложенные элементы <service>). Атрибут name содержит название типа (класса или интерфейса), реализующего контракт сервиса. Вложенный элемент <endpoint> требует адрес, привязку и интерфейс, определяющий контракт сервиса, указанный в атрибуте name элемента <service>.

Подробное описание элементов конфигурирования сервиса доступно в документации Microsoft.

4. Настройте доступ к WCF-сервису для всех пользователей

Для этого в файл ..\Terrasoft.WebApp\Web.config внесите следующие изменения:

  • Добавьте элемент <location>, определяющий относительный путь и права доступа к сервису.
  • В элементе <appSettings> измените значение value для ключа "AllowedLocations", добавив в него относительный путь к сервису.

Пример изменений в файле ..\Terrasoft.WebApp\Web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  ...
  <location path="ServiceModel/UsrCustomConfigurationService.svc">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
  ... 
  <appSettings>
    ...
    <add key="AllowedLocations" value="[Предыдущие значения];ServiceModel/UsrCustomConfigurationService.svc"  />
    ...
  </appSettings>
  ...
</configuration>

После перезагрузки пула приложения в IIS сервис станет доступен по адресу:

[Адрес приложения]/0/ServiceModel/[Название сервиса].svc/[Конечная точка пользовательского сервиса]?[Опциональные параметры]

Например,

http://mysite.сreatio.com/0/ServiceModel/UsrCustomConfigurationService.svc/GetContactIdByName?Name=Supervisor

К сервису можно обращаться из браузера (рис. 1), как с предварительным вводом логина и пароля, так и без их использования.

Рис. 1. — Пример доступа к анонимному сервису из браузера

Смотрите также:

© Terrasoft 2002-2020.

Был ли данный материал полезен?

Как можно улучшить эту статью?