向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,我不确定是否必须在那里做些什么来添加额外的命名空间。
您可以将名称空间添加为自定义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");
}
一旦附加到信封,文档的其余部分将重用这些顶级声明的名称空间,而不是内联名称空间。
我写了一篇博客文章,描述了涉及Message
、MessageFormatter
和FormatMessageAttribute
实现的整个过程: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 { }
这应该允许您在不修改生成的代码的情况下添加命名空间。