【问题标题】:Creating custom MessageHeader with namespace in WCF在 WCF 中使用命名空间创建自定义 MessageHeader
【发布时间】:2016-08-22 10:41:09
【问题描述】:

我需要构建以下 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/命名空间。代码示例表示赞赏!

【问题讨论】:

  • 你能发布你的代码吗?无论如何,要更改命名空间,您需要创建一个新的 Message 对象。您是否在合同中设置了命名空间?

标签: c# xml wcf soap


【解决方案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);

【讨论】:

    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 2014-02-25
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多