在WCF中将自定义命名空间添加到soap信封

时间:2012-02-29 22:52:08

标签: c# .net wcf soap

我正在调用一个服务,它需要在soap信封中添加一个特定的命名空间。

例如,这是我的常规肥皂消息示例

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"  xmlns:sec="ANOTHER NAMESPACE THAT I WANT TO ADD" >
      <s:Header>

     </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xyz xmlns="">
   <customerId>2511</customerId>
  </xyz>
   </s:Body>
   </s:Envelope>

我已经实现了IDispatchMessageInspector,IClientMessageInspector用于其他目的,我不确定是否必须在那里添加额外的命名空间。

2 个答案:

答案 0 :(得分:1)

您可以将命名空间添加为自定义Message实现的一部分,其中包括您可以覆盖的OnWriteStartEnvelope()方法并添加任何自定义命名空间。然后,将消息连接到MessageFormatter,然后使用MessageFormatAttribute将行为附加到特定方法。

添加命名空间的关键方法是在重写的Message实现中,您可以在其中添加命名空间:

protected override void OnWriteStartEnvelope(XmlDictionaryWriter writer)
{
        writer.WriteStartElement("soapenv", "Envelope", "http://schemas.xmlsoap.org/soap/envelope/");
        writer.WriteAttributeString("xmlns", "oas", null, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
        writer.WriteAttributeString("xmlns", "v2", null, "http://www.royalmailgroup.com/api/ship/V2");
        writer.WriteAttributeString("xmlns", "v1", null, "http://www.royalmailgroup.com/integration/core/V1");
        writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
        writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema");            
}

一旦附加到Envelope,文档的其余部分将重用这些顶级声明的命名空间,而不是内联名称空间。

我写了一篇博客文章,介绍了涉及MessageMessageFormatterFormatMessageAttribute实施的完整流程: http://weblog.west-wind.com/posts/2016/Apr/02/Custom-Message-Formatting-in-WCF-to-add-all-Namespaces-to-the-SOAP-Envelope

答案 1 :(得分:0)

如果您是通过svcutil生成代码或添加外部引用,则可以执行以下操作:

[System.ServiceModel.ServiceContractAttribute(Namespace = "ANOTHER NAMESPACE THAT I WANT TO ADD", Name = "sec")]
public partial class TheClassYouAreUsingForAClient {  }

这应该允许您添加命名空间而不修改生成的代码。