Реализация авторизации в заглушке SOAP сервиса на C#. СПИК

Например, класс сгенерированной заглушки сервиса 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 будут выполнены в авторизованном контексте.

  1. class AuthorizationBeh * avior:IEndpointBehavior наверное имелось ввиду class AuthorizationBehavior : IEndpointBehavior?