2017-03-09 5 views
3

メッセージのWS-Addressingヘッダーを変更するIDispatchMessageInspectorBeforeSendReplyメソッドを持つWCFサービスがあります。これは、WSAを除き、すべてのヘッダーのために働く:WCFによって返信メッセージのwsa:Toヘッダーが削除されるのはなぜですか?

public void BeforeSendReply(ref Message reply, object correlationState) 
{ 
    reply.Headers.To = new Uri("urn:something:something:something"); // Why won't this show up in the response? 

    reply.Headers.From = new EndpointAddress("urn:blabla:blabla"); 
    reply.Headers.MessageId = MessageIDHelper.CreateNew(); 
    reply.Headers.ReplyTo = new EndpointAddress(Definitions.WSA_REPLYTO_ANONYMOUS); 
    reply.Headers.Action = Definitions.WSA_ACTION_SOMETHING_SOMETHING; 
} 

...返信から剥ぎ取らされている、これがその結果:

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
    <s:Header> 
    <a:Action s:mustUnderstand="1">http://xxx.xx/xxx/Messages/1/Send</a:Action> 
    <a:RelatesTo>SOME_ID_WHATEVER</a:RelatesTo> 
    <a:From> 
     <a:Address>urn:xxx.xx:xxx:xxx</a:Address> 
    </a:From> 
    <a:MessageID>urn:uuid:083b5fb7-ff45-4944-b881-b4c590577408</a:MessageID> 
    <a:ReplyTo> 
     <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
    </a:ReplyTo> 
    </s:Header> 
    ... 
</s:Envelope> 

result.ToString()(結果= Messageタイプ)が与えられるにもかかわらず私:

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
    <s:Header> 
    <a:Action s:mustUnderstand="1">http://xxx.xx/xxx/Messages/1/Send</a:Action> 
    <a:RelatesTo>SOME_ID_WHATEVER</a:RelatesTo> 
    <a:To s:mustUnderstand="1">urn:xxx.xx:xxx:xxx<a:To> 
    <a:From> 
     <a:Address>urn:xxx.xx:xxx:xxx</a:Address> 
    </a:From> 
    <a:MessageID>urn:uuid:083b5fb7-ff45-4944-b881-b4c590577408</a:MessageID> 
    <a:ReplyTo> 
     <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
    </a:ReplyTo> 
    </s:Header> 
    ... 
</s:Envelope> 

だから... wsa:Toヘッダーが私の返信から削除されたのはなぜですか?

答えて

1

TransportBindingElement.ManualAddressingプロパティのドキュメントは、アドレッシングの動作に関するいくつかの情報を提供します。私。 ManuelAddressingの値がfalseに設定されている場合、送信側チャネルは、To:受信側として構成されたEndpointAddressをチャネル上の送信側メッセージに適用します。これは、チャネルがTo:ヘッダーの値にsayを持つことを意味します。

ここで、BeforeSendReply()は、サービスレベルでメッセージの内容を変更してから、送信するためにチャネルに渡します。したがって、ManuelAddressingの値がfalseの場合、チャネルはメッセージヘッダーに独自のTo:値を設定します。

ManuelAddressingの値がtrueに設定されると、チャネルはメッセージがすでにアドレス指定されているものとみなし、追加の情報は追加しません。 ManuelAddressingをTrueに設定するには、web.configファイルにカスタムバインディングを作成します。

<customBinding> 
    <binding name="customBinding_manualAddressingEnabled"> 
    <textMessageEncoding /> 
    <httpTransport manualAddressing="true"/> 
    </binding> 
</customBinding> 
関連する問題