Подключение к сервису 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);
}
}
}