WCF, Невозможно извлечь httpheader при отправке сообщений как - PullRequest
2 голосов
/ 02 февраля 2011

Я относительно новичок в WCF и / но "похоже" уже получил большинство вещей и работает.

У меня есть следующие IEndpointBehavior и IClientMessageInspector, которые я хочу добавить при вызове сервиса.Он добавляет токен (HTTPHeader), который я хочу проверить на стороне сервера (IIS)

public class AuthenticationTokenEndpointBehavior : IEndpointBehavior
{
    #region Member variables

    public class AuthenticationTokenMessageInspector : IClientMessageInspector
    {
        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
            //throw new NotImplementedException();
        }

        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
            string token = AuthenticationTokenManager.CreateToken();

            HttpRequestMessageProperty httpRequestMessage;
            object httpRequestMessageObject;
            if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))
            {
                httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
            }
            else
            {
                httpRequestMessage = new HttpRequestMessageProperty();
                request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);
            }

            httpRequestMessage.Headers[AuthenticationTokenManager.AUTHENTICATION_TOKEN_NAME] = token;

            return null;
        }

    #endregion

    #region Methods

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
        //throw new NotImplementedException();
    }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        AuthenticationTokenMessageInspector inspector = new AuthenticationTokenMessageInspector();
        clientRuntime.MessageInspectors.Add(inspector);
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
        //throw new NotImplementedException();
    }

    public void Validate(ServiceEndpoint endpoint)
    {
        //throw new NotImplementedException();
    }

    #endregion
}

Я унаследовал и переопределил clientproxys CreateChannel, в который я добавляю свой IEndpointBehavior.

protected override ITheService CreateChannel()
    {
        this.Endpoint.Behaviors.Add(new AuthenticationTokenEndpointBehavior());
        return base.CreateChannel();
    }

Это работает очень хорошо для большинства моих привязок, кроме случаев использования <security mode="Message">.Заголовки не отправляются на сервер.Я гуглил abit, но не нашел никакой информации об этой проблеме.

ОБНОВЛЕНИЕ 1: Чтобы уточнить, вызывается IClientMessageInspector.BeforeSendRequest, но на стороне сервера нет заголовков.

ОБНОВЛЕНИЕ 2: Я пыталсявместо этого добавьте SoapHeader (MessageHeader), но не повезло.Есть ли какое-то безопасное «рукопожатие» перед первым запросом ??

Ответы [ 2 ]

1 голос
/ 03 февраля 2011

Я решил эту проблему с помощью IDispatchMessageInspector на сервисном конце для вызовов WCF. Не простой / быстрый способ, с проверкой HTTPModule, которую я искал. Но все оказалось хорошо. @ Крис Диксон, спасибо за ваше время!

1 голос
/ 02 февраля 2011

Ответ на ваше обновление 2: в зависимости от точной конфигурации вашей привязки вполне может быть предварительный обмен сообщениями SOAP, передающими запрос / ответ токена безопасности WS-Trust, перед обменом сообщениями вашего приложения. Например, конфигурация безопасности сообщений по умолчанию для wsHttpBinding сделает это.

...