Перейти к содержанию

Подключение к сервису Tessa через WSDL

Подключение к сервису Tessa через WSDL

Note

Данный пример работает только на платформе версии 2.x.

Из любого приложения .NET, а также из приложений на других языках и платформах, можно соединиться с веб-сервисами Tessa через SOAP-сообщения, получив информацию по параметрам метода посредством WSDL. Т.о. можно создать интеграционный сервис, методы которого вызываются из внешнего приложения, причём у приложения может не быть доступа к API Tessa. При этом на серверной стороне можно использовать полноценное API, в т.ч. ICardRepository для взаимодействия с карточками, IViewService для чтения представления, IDbScope для обращения к базе данных и др.

Пример веб-сервиса для интеграции есть в расширениях типового решения. Поскольку со стороны клиента не будет доступа к API Tessa, то следует использовать метод передачи сессии через токен в первом параметре, по аналогии с методом GetDataWhenTokenInFirstParameter.

using System.ServiceModel; using Tessa.Platform.Runtime;

namespace Tessa.Extensions.Shared.Services { [ServiceContract, SessionService("tessa/Service.svc")] public interface IService { [OperationContract] object GetDataWhenTokenInFirstParameter([SessionToken] string token, object parameter); } }

В атрибуте [SessionService] должно быть указано имя файла Service.svc. Для сервиса должен быть добавлен файл Service.svc рядом с прочими файлами .svc (в папке веб-приложения tessa рядом с web.config). Для тестового веб-сервиса файл в сборке уже добавлен, для новых веб-сервисов потребуется добавить свой файл .svc.

<% @ServiceHost Language="C#" Debug="true" Service="Tessa.Extensions.Server.Services.Service" Factory="Tessa.Platform.Services.WcfServiceFactory" %>

В файле web.config веб-приложения “tessa” должен размещаться контракт сервиса. В web.config из сборки тестовый сервис уже добавлен, свои сервисы можно добавить по аналогии.

<service name="Tessa.Extensions.Server.Services.Service"> <endpoint contract="Tessa.Extensions.Shared.Services.IService" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding"/> <endpoint address="mex" name="mex" contract="IMetadataExchange" binding="mexHttpsBinding" bindingConfiguration="mexHttpsBinding"/> </service>

Реализация веб-сервиса пишется в серверной библиотеке Tessa.Extensions.Server. Как и в расширениях, в классе сервиса можно получать зависимости из Unity, передавая их через конструктор.

using Tessa.Extensions.Shared.Services; using Tessa.Platform.Data; using Tessa.Platform.Runtime;

namespace Tessa.Extensions.Server.Services { public sealed class Service : IService { public Service(IDbScope dbScope) { this.dbScope = dbScope; }

private readonly IDbScope dbScope;

[SessionMethod] public object GetDataWhenTokenInFirstParameter(string token, object parameter) { using (this.dbScope.Create()) { DbManager db = this.dbScope.Db;

return db .SetCommand( "select @Data", db.Parameter("@Data", parameter)) .LogCommand() .ExecuteScalar<object>(); } } } }

Код регистрации также размещается в Tessa.Extensions.Server.

using Tessa.Extensions.Shared.Services; using Unity.Lifetime;

namespace Tessa.Extensions.Server.Services { [Registrator] public sealed class Registrator : RegistratorBase { public override void RegisterUnity() { this.UnityContainer .RegisterType<IService, Service>(new ContainerControlledLifetimeManager()) ; } } }

На этом реализация веб-сервиса со стороны сервера готова.

Теперь для примера напишем консольную утилиту, которая не требует наличия каких-либо сборок со стороны Tessa API (Tessa.dll и др.), но выполняет подключение к веб-сервису tessa с аутентификацией. В Visual Studio создадим проект “Console app”.

Добавим ссылки на веб-сервисы через пункт “Add service reference” в контекстном меню на пункте “References”.

В поле Address укажем базовый адрес веб-сервиса, к которому будет выполняться подключение, например: https://localhost/tessa

Нажмём кнопку Discover. В списке Services будут перечислены доступные сервисы. Выберем сервис LoginService.svc и укажем ему Namespace (внизу окна) как LoginServiceReference. Если адрес был подставлен как http://, то заменим название протокола на https://.

Нажмём OK и для сервиса по WSDL будет сгенерирован proxy-класс, по которому можно будет выполнить подключение к веб-сервису.

Аналогичным образом добавим ссылку SessionServiceReference на SessionService.svc, и ссылку ServiceReference на наш разработанный сервис Service.svc.

В файле app.config для подключения к сервисам должен быть сгенерирован код, похожий на следующий:

<?xml version="1.0"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup>

<system.serviceModel> <bindings> <basicHttpBinding> <binding name="windows"> <security mode="Transport"> <transport clientCredentialType="Windows" /> </security> </binding> <binding name="BasicHttpBinding_ILoginService"> <security mode="Transport" /> </binding> <binding name="BasicHttpBinding_IService"> <security mode="Transport" /> </binding> <binding name="BasicHttpBinding_ISessionService"> <security mode="Transport" /> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="https://localhost/tessa/tessa/LoginService.svc/windows" binding="basicHttpBinding" bindingConfiguration="windows" contract="LoginServiceReference.ILoginService" name="windows" /> <endpoint address="https://localhost/tessa/tessa/LoginService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ILoginService" contract="LoginServiceReference.ILoginService" name="BasicHttpBinding_ILoginService" /> <endpoint address="https://localhost/tessa/tessa/Service.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService" contract="ServiceReference.IService" name="BasicHttpBinding_IService" /> <endpoint address="https://localhost/tessa/tessa/SessionService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISessionService" contract="SessionServiceReference.ISessionService" name="BasicHttpBinding_ISessionService" /> </client> </system.serviceModel>

</configuration>

В этом конфигурационном файле можно будет изменить путь к сервису, заменив строку с базовым адресом https://localhost/tessa на новый адрес сервера (вместо localhost) и папки с сервисами (вместо tessa).

Код клиентского приложения в файле Program.cs выглядит так:

using System; using System.Net;

namespace ConsoleApp1 { class Program { static void Main(string[] args) { // один раз перед обращением к веб-сервису следует отключить проверку сертификатов HTTPS, // иначе не получится установить соединение по самоподписанным сертификатам ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

// выполняем логин, указывая логин my_login и пароль my_password

string token; using (var loginClient = new LoginServiceReference.LoginServiceClient("BasicHttpBinding_ILoginService")) { token = loginClient.OpenSession(null, Guid.Empty, "my_login", "my_password"); }

// в случае ошибки соединения может быть выброшено исключение FaultException

object result;

try { using (var serviceReference = new ServiceReference.ServiceClient()) { // здесь фактическая работа с сервисом result = serviceReference.GetDataWhenTokenInFirstParameter(token, 42); } } finally { // закрываем сессию по завершении (пытаемся закрыть её даже при наличии исключений) using (var sessionService = new SessionServiceReference.SessionServiceClient()) { sessionService.CloseSessionWithToken(token); } }

Console.WriteLine(result); } } }

Back to top