2016-08-22 63 views
0

我需要构建包括xmlns:u命名空间的以下收据XML结构并将其添加到SOAP标头。所以年底传出SOAP头应该是这个样子:在WCF中使用命名空间创建自定义MessageHeader

<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

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

回答

0

这是我们目前的解决方案,工作正常。

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); 
相关问题