向REST WCF请求添加标头-EnvelopeNone不支持添加消息标头异常
我正在尝试向符合标准RESTful端点的wcf客户端添加自定义头。我正在尝试添加某种头,它只允许我跟踪从一层到下一层的请求。下面是我如何尝试实现它的:向REST WCF请求添加标头-EnvelopeNone不支持添加消息标头异常,wcf,rest,header,Wcf,Rest,Header,我正在尝试向符合标准RESTful端点的wcf客户端添加自定义头。我正在尝试添加某种头,它只允许我跟踪从一层到下一层的请求。下面是我如何尝试实现它的: public class DynatracePurePathHeaderAppender : IClientMessageInspector, IEndpointBehavior { object IClientMessageInspector.BeforeSendRequest(ref Message request, IClientCh
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:信封版本“信封一”
()”没有
支持添加消息头
有人对如何插入这个小钡餐有什么建议吗?我想你指的是HTTP头,而不是SOAP头?如果是这样,MessageHeader与此无关 试着这样做:
HttpRequestMessageProperty hrmp = new HttpRequestMessageProperty();
//Set hrmp.Headers, then:
request.Properties.Add(HttpRequestMessageProperty.Name, hrmp);
通常,WCF REST支持在客户端并没有得到真正的优化(它的创建主要是为了允许人们创建REST服务)。要获得更好的客户端REST支持,请查看WCF REST初学者工具包中的HttpClient。在方法BeforeSendReply中,您需要获得响应:
var httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty;
当您有响应实例时,您可以轻松地添加所需的任何标题:
httpHeader.Headers.Add("my Custom Header", "My Value");
我知道这已经很晚了,但我偶然发现了这篇文章,所以我决定填写这篇文章,以防我需要再次记住这篇文章。这对我很有用:
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
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
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()