Создание пользовательского конфигурационного сервиса
Glossary Item Box
Общие положения
Сервисная модель Creatio реализует базовый набор веб-сервисов, с помощью которых может быть организована интеграция Creatio с внешними приложениями и системами. Примеры системных сервисов:
- EntityDataService.svc — обмен данными с Creatio по протоколу OData 3.
- odata — обмен данными с Creatio по протоколу OData 4.
- ProcessEngineService.svc — запуск бизнес-процессов Creatio из внешних приложений.
Эти сервисы реализованы на основе технологии WCF и управляются на уровне IIS.
Также в Creatio существуют конфигурационные веб-сервисы, предназначенные для вызова из клиентской части приложения. С помощью конфигурационных веб-сервисов можно реализовывать специфические интеграционные задачи.
Конфигурационный веб-сервис представляет собой RESTful-сервис, реализованный на базе технологии WCF. Он доступен по следующему адресу:
[Адрес приложения]/0/rest/[Название пользовательского сервиса]/[Конечная точка пользовательского сервиса]?[Опциональные параметры]
Например:
http://mysite.сreatio.com/0/rest/UsrCustomConfigurationService/GetContactIdByName?Name=User1
Пользовательский конфигурационный сервис доступен только после аутентификации пользователя с помощью сервиса AuthService.svc (см. "Аутентификация внешних запросов").
Чтобы создать пользовательский веб-сервис в конфигурации:
- В пакете разработки создайте схему типа [Исходный код].
- В исходном коде схемы создайте класс сервиса. Задействуйте пространство имен Terrasoft.Configuration или любое вложенное в него пространство имен. Пометьте класс атрибутами [ServiceContract] и [AspNetCompatibilityRequirements] с необходимыми параметрами. Класс сервиса должен быть наследником Terrasoft.Web.Common.BaseService.
- Добавьте в класс реализацию методов, соответствующую конечным точкам сервиса. Каждый метод сервиса должен быть помечен атрибутами [OperationContract] и [WebInvoke] с требуемыми параметрами. При необходимости передавать данные сложных типов (экземпляры объектов, коллекции, массивы и т. п.) вы можете реализовать дополнительные классы, экземпляры которых будет принимать или возвращать метод вашего сервиса. Каждый такой класс должен быть помечен атрибутом [DataContract], а поля класса — атрибутом [DataMember].
- Выполните публикацию схемы исходного кода.
После публикации схемы созданный веб-сервис станет доступен для вызова из программного кода конфигурационных схем, а также из внешних приложений (см. "Вызов конфигурационного сервиса из клиентской части приложения").
Особенности разработки конфигурационного веб-сервиса для обеспечения миграции от ASP.NET Framework к ASP.Net Core.
В базовом классе Terrasoft.Web.Common.BaseService уже определены свойства UserConnection и AppConnection, благодаря которым отпадает необходимость получать эти объекты из текущего контекста с помощью HttpContext.Current библиотеки System.Web фреймворка .NET Framework. Кроме этого в BaseService определено свойство HttpContextAccessor, которое предоставляет доступ к контексту.
Использование HttpContextAccessor обеспечивает унифицированный доступ к HttpContext в обоих фреймворках - и в ASP.NET Framework и ASP.Net Core.
Пример использования свойств родительского класса Terrasoft.Web.Common.BaseService.
namespace Terrasoft.Configuration.UsrCustomNamespace { using Terrasoft.Web.Common; [ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] public class UsrCustomConfigurationService: BaseService { // Метод сервиса. [OperationContract] [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] public void SomeMethod() { ... var currentUser = UserConnection.CurrentUser; // UserConnection - свойство BaseService. var sdkHelpUrl = AppConnection.SdkHelpUrl; // AppConnection - свойство BaseService. var httpContext = HttpContextAccessor.GetInstance(); // HttpContextAccessor - свойство BaseService. ... } } }
Для обеспечения миграции от ASP.NET Framework к ASP.Net Core сервисов, реализованых без наследования базового класса Terrasoft.Web.Common.BaseService, предоставлена возможность получать контекст двумя способами:
- Не рекомендуемый способ: получать контекст через статическое свойство HttpContext.Current. Для обеспечения легкой миграции от фреймворка ASP.NET Framework к ASP.Net Core нужно добавить в исходный код сервиса с помощью директивы using пространство имен Terrasoft.Web.Http.Abstractions, в котором реализован унифицированный доступ к HttpContext, используя статическое свойство HttpContext.Current. При адаптации старого кода к новому фреймворку достаточно заменить namespace System.Web на Terrasoft.Web.Http.Abstractions.
- Рекомендуемый способ: получать контекст через IHttpContextAccessor зарегистрированный в DI (ClassFactory) . Этот способ позволяет покрывать код тестами. Подробнее об использовании Фабрики классов можно узнать из статьи "Фабрика объектов замещающих классов".
Использовать в конфигурации конкретную реализацию доступа к контексту из ASP.NET (библиотека System.Web) или ASP.NET Core (библиотека Microsoft.AspNetCore.Http) запрещено.
Пример адаптации сервиса к ASP.Net Core
namespace Terrasoft.Configuration.UsrCustomNamespace { using Terrasoft.Web.Http.Abstractions; // Использовать вместо System.Web [ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] public class UsrCustomConfigurationService { // Метод сервиса. [OperationContract] [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] public void SomeMethod() { ... var httpContext = HttpContext.Current; ... } } }
Смотрите также: