Как использовать WS-Addressing в WCF и установить заголовок wsa: replyto? - PullRequest
10 голосов
/ 03 февраля 2012

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

Мы используем согласование вначале с автоматически сгенерированным кодом из svcutil (мы не можем «просто» изменить договор) ...

И это невозможно сделать в конфигурационном файле ...

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

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

1 Ответ

10 голосов
/ 06 февраля 2012

Чтобы вызвать службу, требующую WS-Addressing из 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-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>
...