我正在调用一个服务,它需要在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用于其他目的,我不确定是否必须在那里添加额外的命名空间。
答案 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,文档的其余部分将重用这些顶级声明的命名空间,而不是内联名称空间。
我写了一篇博客文章,介绍了涉及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
答案 1 :(得分:0)
如果您是通过svcutil生成代码或添加外部引用,则可以执行以下操作:
[System.ServiceModel.ServiceContractAttribute(Namespace = "ANOTHER NAMESPACE THAT I WANT TO ADD", Name = "sec")]
public partial class TheClassYouAreUsingForAClient { }
这应该允许您添加命名空间而不修改生成的代码。