向WCF中的soap信封添加自定义命名空间

本文关键字:添加 自定义 命名空间 WCF 中的 soap | 更新日期: 2023-09-27 18:26:17

我正在调用一个服务,它需要在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、IClientMessageInspecter,我不确定是否必须在那里做些什么来添加额外的命名空间。

向WCF中的soap信封添加自定义命名空间

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

添加名称空间的关键方法是在重写的Message实现中,在该实现中可以将名称空间添加到Envelope:

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");            
}

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

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

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

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

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