【问题标题】:Change namespace Prefix WCF Envelope更改命名空间前缀 WCF 信封
【发布时间】:2011-06-28 12:52:39
【问题描述】:

我想知道是否可以更改 WCF SOAP 请求的命名空间前缀?

正如您在下面的示例中所见,信封的命名空间“http://www.w3.org/2005/08/addressing”带有前缀“a”。我想将其更改为“foo”。我怎样才能做到这一点。 注意我无法控制服务代码,我只能从 WSDL 创建代理类。

 <s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<a:Action s:mustUnderstand="1">http://www.starstandards.org/webservices/2005/10/transport/operations/MyAction</a:Action>
<h:payloadManifest xmlns="http://www.starstandards.org/webservices/2005/10/transport" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:h="http://www.starstandards.org/webservices/2005/10/transport">
<manifest contentID="Content0" namespaceURI="http://www.starstandard.org/STAR/5" element="TESTMETHOD" version="5.2.4"></manifest>
</h:payloadManifest>
<h:Identity xmlns="urn:xxx/xxx/" xmlns:h="urn:xxx/xxx">
<SiteCode>XXXXXX</SiteCode>
</h:Identity>
<a:To>urn:xxx/xxx/Method1</a:To>
<MessageID xmlns="http://www.w3.org/2005/08/addressing">XXXXX</MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
</s:Header>

【问题讨论】:

  • 您认为为什么要更改前缀?它不应该对正确理解 XML 的任何东西产生任何影响。
  • 我知道只是更改前缀不应该有任何区别,但是我要使用的服务,我无法控制它,也不知道它如何处理 SOAP 请求。目前,我收到与一个元素相关的服务器错误消息,该元素可以预期前缀。它的消除过程。谢谢
  • 感谢所有回复。我认为可以实现这一点的一种方法是使用 IClientMessageInspector、IEndpointBehavior,如其所示 social.technet.microsoft.com/wiki/contents/articles/…。在发送请求之前触发其中一个事件。此时,您可以获得 Row SOAP 消息并进行操作(可能不建议这样做)。希望这对其他人有所帮助。
  • 我对此表示怀疑。在客户端消息检查器中,您无法访问原始 SOAP 消息,您会获得一个 Message 对象(其中消息头表示为 Header 对象的集合)之前它们已经通过编码器将确定消息在其有线表示中的样子。我看不出你是如何从这里夺取对命名空间前缀的控制权......但无论如何都要尝试,如果你找到办法,请发布更新。

标签: wcf namespaces prefix


【解决方案1】:

这可以通过使用 MessageFormatter 在客户端或服务器端完成。您也可以使用 MessageEncoder 更改此设置,但这有很多问题。

本文描述了如何在服务器端使用 MessageFormatter 以及 MessageEncoder 的缺点:

http://vanacosmin.ro/Articles/Read/WCFEnvelopeNamespacePrefix

您需要做的是应用 MessageFormatter 客户端(可能使用 ApplyClientBehavior 而不是 ApplyDispatchBehavior)。此外,在自定义消息类中,您需要将命名空间添加为属性,并带有“foo”前缀(在 OnWriteStartEnvelope 方法中)。

不幸的是,没有简单的方法(例如应用某些属性)可以进行所需的更改。

【讨论】:

  • 是的,由于服务器维护,该网站已关闭。我很快就会重新上线。
【解决方案2】:

WCF 提供了使用消息协定控制大部分 SOAP 信封细节的能力。 但我怀疑你是否可以用命名空间前缀做一些事情。但是,您可以控制命名空间。

请参考Using Message Contracts

【讨论】:

  • 谢谢,但是使用消息契约意味着可以控制服务器端代码。我没有。
  • 不需要。整体而言,WCF 并不是一种写服务的技术。其用于交流。您甚至可以为非 WCF 服务编写 WCF 客户端。在您的情况下,您可以使用 WCF 创建客户端,还可以为您的客户端代码创建消息协定。如果您使用的是 Visual Studio,则服务参考对话框将为您提供在高级选项下创建消息合同的选项。如果使用 svcutil.exe 创建客户端,可以使用 /mc 开关创建消息合约。
【解决方案3】:

我不知道有什么方法可以控制 WCF 在其标准消息编码器中使用的前缀。

如果您希望线路上的消息使用不同的前缀,我认为您必须编写自定义消息编码器。

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2013-07-22
    • 1970-01-01
    相关资源
    最近更新 更多