如何在 WCF 中使用 WS-Addressing 并设置 wsa:replyto 标头?

Posted

技术标签:

【中文标题】如何在 WCF 中使用 WS-Addressing 并设置 wsa:replyto 标头?【英文标题】:How do I use WS-Addressing in WCF and set the wsa:replyto header? 【发布时间】:2012-02-26 03:15:33 【问题描述】:

我正在使用 WCF 调用 BizTalk 服务。该服务要求在 SOAP 标头中设置 wsa:replyto 地址,以便在处理完成时能够进行“回调”。

我们正在使用合约优先的方法和从 svcutil 自动生成的代码(我们不能“只是”更改合约)...

而且在配置文件中是不可能做到的...

我看到有人“覆盖”一些方法来制作自己的自定义标头 - 但这不是自定义标头,它是 SOAP 协议中的标准。

如何在 (SOAP) 标头中添加 wsa:replyto?

【问题讨论】:

【参考方案1】:

为了从 WCF 调用需要 WS-Addressing 的服务,您必须将客户端端点配置为使用支持它的绑定,例如 WSHttpBinding。

然后,您可以通过 OperationContext.OutgoingMessageHeaders 属性将 wsa:ReplyTo 标头设置为客户端代码中的特定 URL:

using (new OperationContextScope((IContextChannel)channel))

    OperationContext.Current.OutgoingMessageHeaders.ReplyTo =
        new EndpointAddress("http://client/callback");

    channel.DoSomething();

在此示例中,我们将 wsa:ReplyTo 标头设置为已知 URL,客户端通道在该 URL 中侦听来自服务的传入回调消息。

或者,如果服务支持,您可以使用 WSDualHttpBinding,它通过 WS-Addressing 内置了对双工通信的支持。在这种情况下,您将通过 WSDualHttpBinding.ClientBaseAddress 属性设置回调地址:

<system.serviceModel>
    <bindings>
        <wsDualHttpBinding>
            <binding clientBaseAddress="http://client/callback" />
        </wsDualHttpBinding>
    </bindings>

    <client>
        <endpoint address="http://server/service"
                  binding="wsDualHttpBinding"
                  contract="Namespace.Service" />
    </client>
</system.serviceModel>

【讨论】:

我找到了一个比您的解决方案复杂得多的解决方案...您的解决方案很好,简单且干净...谢谢! 我使用的是自定义绑定,所以必须设置 -->

以上是关于如何在 WCF 中使用 WS-Addressing 并设置 wsa:replyto 标头?的主要内容,如果未能解决你的问题,请参考以下文章

自定义 WCF 绑定等效于 WSHttpBinding 且 WS-Addressing 已关闭

如何使用 WCF 实现 WS 寻址?

asp net core soap请求ws-addressing

尝试将 gSoap 与 WCF 和 WSHttpBinding 一起使用

如何在 Axis2 客户端中正确使用 WS-Addressing?

WCF寻址 - 删除WSA:TO元素