【问题标题】:How to add attribute to WCF message header with MessageHeader.CreateHeader() method?如何使用 MessageHeader.CreateHeader() 方法向 WCF 消息头添加属性?
【发布时间】:2011-07-10 20:23:21
【问题描述】:

我正在使用以下代码添加 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"

作为此消息头的属性。

有没有办法在消息头中添加上述命名空间和属性?

【问题讨论】:

    标签: wcf wcf-client


    【解决方案1】:

    我找到了解决方案。 我们必须实现自定义标头,它继承自 MessageHeader 类。

    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

    【讨论】:

      【解决方案2】:

      定义一个 XmlSerializable 类,该类可序列化为您希望用于标题的 XML 元素格式。然后将此类的一个实例作为MessageHeader.CreateHeadervalue 参数传递。

      【讨论】:

        【解决方案3】:

        如果您使用 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();
        }
        

        【讨论】:

          猜你喜欢
          • 2020-01-20
          • 1970-01-01
          • 2020-07-25
          • 1970-01-01
          • 1970-01-01
          • 2015-01-23
          • 1970-01-01
          • 2012-02-18
          • 1970-01-01
          相关资源
          最近更新 更多