Создание анонимного веб-сервиса
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. — Пример доступа к анонимному сервису из браузера
Смотрите также: