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

时间:2012-02-03 13:57:42

标签: wcf c#-4.0 soap ws-addressing

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

我们正在使用合同优先的approch来自svcutil自动生成的代码(我们不能'只是'改变合同)......

在配置文件中无法做到......

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

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

1 个答案:

答案 0 :(得分:10)

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

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

using (new OperationContextScope((IContextChannel)channel))
{
    OperationContext.Current.OutgoingMessageHeaders.ReplyTo =
        new EndpointAddress("http://client/callback");

    channel.DoSomething();
}

在此示例中,我们将wsa:ReplyTo标头设置为已知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>