Добавить заголовок к запросу REST WCF - EnvelopeNone не поддерживает добавление исключения заголовков сообщений - PullRequest
3 голосов
/ 02 октября 2009

Я пытаюсь добавить пользовательский заголовок к клиенту wcf со стандартной конечной точкой RESTful. Я пытаюсь добавить какой-то заголовок, который позволит мне отслеживать запросы от одного уровня к другому. Вот как я пытался это реализовать:

public class DynatracePurePathHeaderAppender : IClientMessageInspector, IEndpointBehavior
 {
  object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientChannel channel)
  {
   var dynaHeader = MessageHeader.CreateHeader("Action", "ns.yellowbook.jeff", "dynatrace",false);
   request.Headers.Add(dynaHeader);
   return null;
  }

  void IClientMessageInspector.AfterReceiveReply(ref Message reply, object correlationState)
  {
   return;
  }

  public void Validate(ServiceEndpoint endpoint){}

  public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters){}

  public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher){}

  public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
  {
   clientRuntime.MessageInspectors.Add(this);
  }
 }

public class DynatracePurePathHeaderAppenderElement : BehaviorExtensionElement
 {
  protected override object CreateBehavior()
  {
   return new DynatracePurePathHeaderAppender();
  }

  public override Type BehaviorType
  {
   get { return typeof(DynatracePurePathHeaderAppender); }
  }
 }

Затем я успешно настраиваю клиента, но когда он запускается, я получаю следующее исключение:

System.InvalidOperationException: версия конверта 'EnvelopeNone (http://schemas.microsoft.com/ws/2005/05/envelope/none)' не поддержка добавления заголовков сообщений.

У кого-нибудь есть предложения, как вставить эту маленькую бариевую муку?

Ответы [ 3 ]

4 голосов
/ 02 октября 2009

Я предполагаю, что вы имеете в виду заголовок HTTP, а не заголовок SOAP? Если это так, MessageHeader не имеет к этому никакого отношения.

Попробуйте что-то вроде этого:

HttpRequestMessageProperty hrmp = new HttpRequestMessageProperty();
//Set hrmp.Headers, then:
request.Properties.Add(HttpRequestMessageProperty.Name, hrmp);

Как правило, поддержка WCF REST не оптимизирована на стороне клиента (она была создана в основном для того, чтобы люди могли создавать службы REST). Для гораздо лучшей поддержки REST на стороне клиента обратитесь к HttpClient в стартовом наборе REST WCF.

1 голос
/ 10 января 2013

В методе BeforeSendReply вам нужно получить ответ:

var httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty;

Если у вас есть экземпляр ответа, вы можете легко добавить любой заголовок:

httpHeader.Headers.Add("my Custom Header", "My Value");
0 голосов
/ 22 января 2015

Я знаю, что уже поздно, но я наткнулся на этот пост, поэтому решил заполнить его, на случай, если мне когда-нибудь понадобится вспомнить это снова. Это сработало для меня:

  1. Создать инспектор сообщений:

    Public Class AuthenticationHeader
      Implements IClientMessageInspector
    
    Private itsUser As String
    Private itsPass As String
    
    Public Sub New(ByVal user As String, ByVal pass As String)
        itsUser = user
        itsPass = pass
    End Sub
    
    Public Sub AfterReceiveReply(ByRef reply As Message, correlationState As Object) Implements IClientMessageInspector.AfterReceiveReply
        Console.WriteLine("Received the following reply: '{0}'", reply.ToString())
    End Sub
    
    Public Function BeforeSendRequest(ByRef request As Message, channel As IClientChannel) As Object Implements IClientMessageInspector.BeforeSendRequest
        Dim hrmp As HttpRequestMessageProperty = request.Properties("httpRequest")
        Dim encoded As String = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(itsUser + ":" + itsPass))
        hrmp.Headers.Add("Authorization", "Basic " + encoded)
        Return request
      End Function
    End Class
    
  2. Напишите поведение:

    Public Class AuthenticationHeaderBehavior
    Implements IEndpointBehavior
    
    Private ReadOnly itsUser As String
    Private ReadOnly itsPass As String
    
    Public Sub New(ByVal user As String, ByVal pass As String)
        MyBase.New()
        itsUser = user
        itsPass = pass
    End Sub
    
    Public Sub AddBindingParameters(endpoint As ServiceEndpoint, bindingParameters As BindingParameterCollection) Implements IEndpointBehavior.AddBindingParameters
    End Sub
    
    Public Sub ApplyClientBehavior(endpoint As ServiceEndpoint, clientRuntime As ClientRuntime) Implements IEndpointBehavior.ApplyClientBehavior
        clientRuntime.MessageInspectors.Add(New AuthenticationHeader(itsUser, itsPass))
    End Sub
    
    Public Sub ApplyDispatchBehavior(endpoint As ServiceEndpoint, endpointDispatcher As EndpointDispatcher) Implements IEndpointBehavior.ApplyDispatchBehavior
    End Sub
    
    Public Sub Validate(endpoint As ServiceEndpoint) Implements IEndpointBehavior.Validate
    End Sub
    End Class
    
  3. Добавьте его в конечную точку:

      Dim binding As New WebHttpBinding(WebHttpSecurityMode.Transport)
      binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None
    
      ChlFactory = New WebChannelFactory(Of IMyServiceContract)(binding, New Uri(url))
      ChlFactory.Endpoint.Behaviors.Add(New WebHttpBehavior())
      ChlFactory.Endpoint.Behaviors.Add(New AuthenticationHeaderBehavior(user, pass))
      Channel = ChlFactory.CreateChannel()
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...