Установка поля MessageHeaders.To перезаписывается

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

Мне нужно в основном POST-запрос, подобный следующему, в службу маршрутизатора:

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 для отладки, когда это поле установлено, и, конечно же, оно перезаписывается (скриншот трассировки стека и точки останова).

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


person Mike Atlas    schedule 14.03.2012    source источник


Ответы (1)


Я понял это самостоятельно с помощью подсказка отсюда. Программно я могу установить 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");
}
person Mike Atlas    schedule 14.03.2012