Как использовать WS-адресацию в WCF и установить заголовок wsa:replyto?

Я вызываю службу BizTalk с помощью WCF. Служба требует, чтобы адрес WSA: replyto был установлен в заголовке SOAP, чтобы сделать "обратный вызов", когда процесс будет завершен.

мы используем контракт-первый подход с автоматически сгенерированным кодом из svcutil (мы не можем "просто" изменить контракт)...

и это невозможно сделать в файл config...

Я видел, что кто - то "переопределяет" некоторые методы, чтобы сделать свой собственный заголовок, но это не пользовательский заголовок это стандарт в протоколе SOAP.

Как добавить WSA: replyto в заголовок (SOAP)?

1 ответов


для вызова службы, которая требует WS-адресации из WCF вам нужно настроить конечную точку клиента для использования привязки, которая ее поддерживает, например привязка wshttpbinding.

затем вы можете установить wsa:ReplyTo заголовок к определенному URL-адресу в коде клиента через OperationContext.OutgoingMessageHeaders свойства:

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

    channel.DoSomething();
}

в этом примере мы ставим wsa:ReplyTo заголовок к известному URL, где клиент канал прослушивает входящие сообщения обратного вызова от службы.

кроме того, если служба поддерживает его можно использовать элементов wsdualhttpbinding, который имеет встроенную поддержку дуплексная связь через WS-адресацию. В этом случае вы бы установили адрес обратного вызова через элементов 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>