Установка MessageHeaders.To поле перезаписывается - PullRequest
1 голос
/ 15 марта 2012

Вот сценарий: я пытаюсь отправить сообщение SOAP в службу промежуточного маршрутизатора. Эта служба заботится только о моих заголовках сообщений SOAP и использует заголовок WS-Addressing To для пересылки моего сообщения.

Мне нужно в основном отправить запрос в службу роутера, как показано ниже:

POST http://gatewayRouter/routingService HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Host: gatewayRouter
Content-Length: 8786
Expect: 100-continue
Connection: Keep-Alive

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
    xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header> <!-- ... --> 
<a:To s:mustUnderstand="1">http://actualDestination</a:To>
</s:Header> <!-- ... body, /envelope, etc --->

В настоящее время я могу установить другие настраиваемые заголовки, которые требуются службе маршрутизации, используя Настраиваемые поведения без проблем:

public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
    MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
    request = buffer.CreateMessage();
    request.Headers.To = new Uri("http://actualDestination");
    request.Headers.Add(new CustomHeader());
    return null;
}

Приведенный выше код прекрасно работает для добавления моего CustomHeader в сообщение, но не может изменить поле исходящей WS-Addressing To - он всегда возвращается к тому же URI, что и значение HTTP POST. На самом деле, я использовал .NET Reflector для отладки, когда это поле установлено, и, конечно же, оно перезаписывается ( снимок экрана трассировки стека и точки останова ).

Есть ли какой-то другой способ изменить заголовок To SOAP, который я не правильно понимаю?

1 Ответ

0 голосов
/ 15 марта 2012

Я понял это сам с подсказкой отсюда . Программно, я могу установить Via на ClientRuntime внутри пользовательского поведения . Это позволяет POST отличаться от фактического адреса конечной точки, который устанавливается автоматически из-за моего использования WSHttpBinding.

public void ApplyClientBehavior
    (ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
    CustomMessageInspector inspector = new CustomMessageInspector();
    clientRuntime.MessageInspectors.Add(inspector);
    clientRuntime.Via = new Uri("http://gatewayRouter/routingService");
}
...