2012-03-14 1 views
1

Вот сценарий: я пытаюсь отправить SOAP-сообщение в службу промежуточного маршрутизатора. Эта служба заботится только о моих заголовках SOAP-сообщений и использует заголовок WS-AddressingTo для отправки по моему сообщению.Настройка MessageHeaders.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 ---> 

Я в настоящее время в состоянии установить другие пользовательские заголовки, что служба маршрутизации требует, используя Custom Behaviors без проблем:

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 для отладки, когда это поле получает множество и, конечно же, оно перезаписывается (screenshot of the stack trace and breakpoint).

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

ответ

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^