如何使用MessageHeader.CreateHeader()方法向WCF邮件头添加属性?

时间:2011-03-08 04:41:05

标签: wcf wcf-client

我正在使用以下代码添加WCF自定义标头

 MessageHeader header = MessageHeader.CreateHeader("Key", "ns", "Value");
 OperationContext.Current.OutgoingMessageHeaders.Add(header);

有了这个我还想添加

    xmlns:wsa="http://www.w3.org/2005/08/addressing"
   wsa:IsReferenceParameter="1"

作为此Message标头的属性。

有没有办法将上面的命名空间和属性添加到邮件头?

3 个答案:

答案 0 :(得分:7)

我找到了解决方案。 我们必须实现从MessageHeader类中隐藏的custome头。

MessageHeader类确实有方法OnWriteStartHeader()。我们可以在这个方法中添加xml命名空间。

此外,我们必须覆盖OnWriteHeaderContents()方法,并将我们想要的xml或值写为MessageHeader。

准备就绪后,在request.Header.Add()中添加邮件头,并传递自定义标题类的对象。

请参阅以下链接了解更多详情。

http://www.netframeworkdev.com/windows-communication-foundation/messageheader-serializer-how-to-use-attributes-52827.shtml

http://social.msdn.microsoft.com/forums/en-US/wcf/thread/c2a39df8-3943-4c41-acca-6da8e96f0dff

答案 1 :(得分:0)

定义一个XmlSerializable类,该类序列化为标题所需的XML元素格式。然后将此类的实例作为value的{​​{1}}参数传递。

答案 2 :(得分:0)

如果使用AddressHeader类,它会自动添加isReferenceParameter属性。 ChannelFactory的以下扩展方法可以满足您的需求。

public static void AddHeader<T>(this ChannelFactory<T> factory, string headerName, string value, string nameSpace)
{
    var endpointAddressBuilder = new EndpointAddressBuilder(factory.Endpoint.Address);
    endpointAddressBuilder.Headers.Add(AddressHeader.CreateAddressHeader(headerName, nameSpace, value));

    factory.Endpoint.Address = endpointAddressBuilder.ToEndpointAddress();
}