Как отправлять и извлекать информацию пользовательского заголовка для службы REST WCF

#rest #wcf #c#-4.0

#rest #wcf #c #-4.0

Вопрос:

Я пытаюсь настроить инфраструктуру в своем решении для отправки и извлечения пользовательского заголовка для службы REST WCF. В принципе, нам это нужно для отправки идентификатора пользователя, пароля, значения токена от клиента к службе, и если предоставленные значения действительны, то операция продолжит выполняться, в противном случае возникнет исключение.

У нас уже есть несколько классов, унаследованных от интерфейсов, таких как IDispatchMessageInspector, IClientMessageInspector, IEndPointBehaviour, MessageHeader и т.д., Это отлично работает для WCF с запросом soap. Я пытался использовать эти классы для моей новой службы REST WCF, но не работал, поскольку производный класс MessageHeader поддерживает только Soap.

Я также пытался использовать WebOperationContext, но безуспешно: (

Пожалуйста, предоставьте решение вместе с примером проекта для решения этой проблемы.

Большое вам спасибо!

Ответ №1:

Кажется, в вашем случае было бы проще взаимодействовать с конвейером ASPNET

если вы добавите следующее в свою службу WCF, чтобы разрешить ее подключение к конвейеру ASPNET

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Разрешено)]

Тогда вы можете просто использовать объект HttpContext и просто получать заголовки, как из обычного приложения aspnet, например

 System.Web.HttpContext.Current.Request.Headers["CustomHeader"]
  

Ответ №2:

Если вы хотите добавить http-заголовок в службу wcf rest, вам следует использовать HttpRequestMessageProperty , у него есть свойство Headers , вы можете установить http-заголовок через его свойство Headers

 using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))
{
    HttpRequestMessageProperty property;
         // if OutgoingMessageProperties already has HttpRequestMessageProperty, use the existing one , or  initialize a new one and       
         // set OutgoingMessageProperties's HttpRequestMessageProperty.Name key's value to the initialized  HttpRequestMessageProperty so that the HttpRequestMessageProperty  will work 
    if (OperationContext.Current.OutgoingMessageProperties.ContainsKey(HttpRequestMessageProperty.Name)){
        property = OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
    }
    else
    {
        property = new HttpRequestMessageProperty();
        OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = property;
    }
        // add headers to  HttpRequestMessageProperty, it will become the http header of the reuqest
    property.Headers.Add(System.Net.HttpRequestHeader.Authorization, "myAuthorization");
    string re = client.HelloWorld();
}
  

Для получения заголовка просто используйте WebOperationContext.Current.Заголовки.

 WebOperationContext.Current.IncomingRequest.Headers["MyCustomHttpHeader"]
  

Пожалуйста, обратитесь к http://kenneththorman.blogspot.com/2011/02/wcf-rest-client-using-custom-http.html