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