如何手动覆盖WCF客户端发送的WSA To标头

时间:2012-05-03 06:27:25

标签: c# wcf ws-addressing

我目前正在为我无法控制的Java Web服务编写WCF客户端。 WCF似乎使用端点地址填充WSA To标头,但此Web服务需要不同的值。

我目前正在尝试手动设置值,如下所示:

var binding = new CustomBinding();
binding.Elements.Add(GetSecurityElement());
binding.Elements.Add
(
    new TextMessageEncodingBindingElement
    (
        MessageVersion.Soap11WSAddressing10,
        Encoding.UTF8
    )
);
binding.Elements.Add(new HttpsTransportBindingElement());

var endpoint = new EndpointAddress
(
    new Uri("endpoint address"),
    new DnsEndpointIdentity("endpoint identity"),
    new AddressHeaderCollection()
);

var client = new Client(binding, endpoint);
client.Open();

using (new OperationContextScope(client.InnerChannel))
{
    OperationContext.Current.OutgoingMessageHeaders.To = new Uri("some other address");
    OperationContext.Current.OutgoingMessageHeaders.MessageId = new UniqueId("message id");
    var response = client.doSomething();
}

检查使用Fiddler生成和发送的请求,我可以看到MessageID标头已成功设置为“message id”而不是默认的urn:uuid:[some uuid],但To标头仍然存在设置为“端点地址”而不是“其他地址”。

是否有其他方法可以覆盖标头值?

2 个答案:

答案 0 :(得分:1)

我有managd使用oulined here方法来解决这个问题。在代码中,解决方案是使用:

        var endpoint = new EndpointAddress
        (
            new Uri("wsa to address"),
            new DnsEndpointIdentity("endpoint identity"),
            new AddressHeaderCollection()
        );

设置WSA To标头的值。然后使用:

        client.Endpoint.Behaviors.Add(new ClientViaBehavior(new Uri("address")));

控制实际发送请求的地址。

答案 1 :(得分:1)

ClientVia也可以添加到.config文件的endpointBehavior元素中:

<behaviors>
      <endpointBehaviors>
            <behavior name="someBehavior">
                  <clientVia viaUri="[URL of the actual host]" />
            </behavior>
      </endpointBehaviors>
</behaviors>
<client>
      <endpoint address="[Value of the wsa:To header]" ..... other settings ... />
</client>

请注意,您还需要使用正确的绑定设置 - 在textMessageEncoding中使用正确的messageVersion的customBinding或wsHttpBinding - 以便使用WS-Addressing。