Например, класс сгенерированной заглушки сервиса UnitsService называется SpicSoapUnitsServiceClient. Чтобы реализовать авторизацию в SpicSoapUnitsServiceClient, необходимо добавить два класса в проект, в котором создавалась заглушка к сервису: препроцессор запросов к SOAP сервису и Behavior (поведение). Код этих классов будет приведен ниже.
Функция препроцессора заключается во вложении токена авторизации в каждый http запрос, который идет к СПИК. В данном классе используется статический класс TokenRepository. Его публичное поле Token содержит токен авторизации. Он помещается туда после того, как авторизация выполнена (см. Авторизация в СПИК):
internal class AuthorizationPreprocessor : IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply, object correlationState)
{
Console.WriteLine("Data received");
}
public object BeforeSendRequest(ref Message request, System.ServiceModel.IClientChannel channel)
{
if (!request.Properties.ContainsKey("httpRequest"))
{
request.Properties.Add("httpRequest",new HttpRequestMessageProperty());
LogManager.ExceptionLog.Error(request.ToString());
}
var httpHeader = request.Properties["httpRequest"] as HttpRequestMessageProperty;
var user = Thread.CurrentPrincipal as ScoutPrincipal;
if (user == null || user.ScoutIdentity == null || user.ScoutIdentity.ScoutSession == null) return null;
if (httpHeader != null)
{
httpHeader.Headers.Add("ScoutAuthorization", user.ScoutIdentity.ScoutSession.SpicToken);
}
return null;
}
}
class AuthorizationBehavior : IEndpointBehavior
{
private readonly AuthorizationPreprocessor _authorizationPreprocessor;
public AuthorizationBehavior()
{
_authorizationPreprocessor=new AuthorizationPreprocessor();
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.MessageInspectors.Add(_authorizationPreprocessor);
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
Чтобы добавить это поведение к заглушке SpicSoapUnitsServiceClient, необходимо выполнить следующий код:
//заглушка сервиса
_unitsClient = new SpicSoapUnitsServiceClient();
//добавляем поведение
_unitsClient.Endpoint.Behaviors.Add(new AuthorizationBehavior());
После этого все вызовы методов в unitsClient будут выполнены в авторизованном контексте.
Номер материала: 487
Отправлено: Wed, Sep 12, 2018
Последнее обновление: Wed, Nov 6, 2019
Отправлено: Анисимов Максим Михайлович [m.anisimov@scout-gps.ru]
Online URL: https://kb.scout-gps.ru/article/Реализация-авторизации-в-заглушке-soap-сервиса-на-c-СПИК-487.html