在WCF中使用命名空间创建自定义MessageHeader

时间:2016-08-22 10:41:10

标签: c# xml wcf soap

我需要构建以下Receipts XML结构,包括xmlns:u命名空间,并将其添加到SOAP标头中。因此,最终传出的SOAP标头应如下所示:

    <Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
                xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing">
     <s:Header>
       <u:Receipts xmlns:u="http://MyCompany/abc">
        <Receipt>
         <Id />
         <Text />
        </Receipt>
       <Receipt>
        <Id />
        <Text />
       </Receipt>
       <Receipt>
        <Id />
        <Text />
       </Receipt>
    </u:Receipts>
   </s:Header>
   <s:Body />
</Envelope>

我重写了MessageHeader类并在OnWriteHeaderContents方法中构建了xml。但是,我无法获得正确的xml /命名空间。代码示例表示赞赏!

1 个答案:

答案 0 :(得分:1)

这是我们目前的解决方案,效果很好。

    public class ReceiptsHeader : MessageHeader
{
    private const string HeaderName = "Receipts";
    private const string HeaderNamespace = "http://MyCompany/abc";

    public override string Name => HeaderName;

    public override string Namespace => HeaderNamespace;

    private readonly XmlDocument _usageReceipt = new XmlDocument();

    public ReceiptsHeader(IEnumerable elements)
    {
        var headerString = new StringBuilder("<Receipts xmlns=\"http://MyCompany/abc\">");
        foreach (var elem in elements)
        {
            // Build <Receipt> nodes here...
        }
        headerString.Append("</Receipts>");

        _usageReceipt.LoadXml(headerString.ToString());
    }

    protected override void OnWriteHeaderContents(XmlDictionaryWriter writer, MessageVersion messageVersion)
    {
        foreach (XmlNode node in _usageReceipt.ChildNodes[0].ChildNodes)
            writer.WriteNode(node.CreateNavigator(), false);

    }
}

然后我们将它添加到BeforeSendReply方法的SOAP标头中,如下所示:

ReceiptsHeader head = new ReceiptsHeader(elements);
reply.Headers.Add(head);