在WCF中自定义SOAP头命名空间前缀

5

我曾经写过一篇文章,介绍了如何自定义wcf生成的SOAP消息中的命名空间和命名空间前缀,链接在这里

但是,我找不到在Message类中覆盖以便自定义消息的SOAP头部的适当方法。

我想要让这条消息变成:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<h:Protocol xmlns="http://www.xyz.de/Protocol" xmlns:h="http://www.xzy.de/Protocol">
<version>IFD_1.4</version>
</h:Protocol>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
</s:Body>
</s:Envelope>

看起来像这样:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<if:Protocol xmlns="http://www.xyz.de/Protocol" xmlns:if="http://www.xzy.de/Protocol">
<version>IFD_1.4</version>
</if:Protocol>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
</s:Body>
</s:Envelope>

区别在于第一个标题的命名空间是“if”,而不是“f”。

是否可以使用自定义的MessageFormatter和自定义的Message类来完成此操作?


你为什么关心前缀? - John Saunders
2
通常我不这样做。但有时我们需要使用新技术“重写”旧服务,并支持旧客户端。虽然新客户端不会关心前缀,但旧客户端已经手动实现了解析算法,与soap或xml无关(他们只是将其解析为字符串并从中获取所需内容,搜索类似“if:Protocol”的字符串)。 - Cosmin Vană
2个回答

3
我找到的解决方案是从MessageHeader类派生并在自定义消息类中使用它(请参见问题链接以查看我如何使用自定义消息类来自定义信封和正文起始标记)。
一旦准备好,我将使用完整示例更新答案。
如果您有不同的解决方案,请将其发布为更简单的答案,可在不破坏wcf功能的情况下运行。

0
你可以使用自定义的 MessageEncoder,在 ReadMessage 和 WriteMessage 方法中,你可以对 xml 进行任何你想要的操作。

1
如果您启用了消息安全性,消息编码器将无法工作。此操作在协议通道之后执行。 - Cosmin Vană

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接