繁体   English   中英

确保使用特定的网络接口执行传出的WCF请求

[英]Ensuring that outgoing WCF requests are performed using a specific network interface

我有从应用程序连接到的远程WCF Web服务。

该应用程序可能正在具有多个IP地址(或多个物理网络接口)的服务器上运行

我需要确保可以控制出站请求使用的IP地址,而不是按照常规度量标准仅使用“首选”接口。

这样做的原因是,该软件的多个副本将在同一台计算机上运行,​​每个副本都绑定到一个特定的IP地址以用于其自身的操作,并且连接到的远程服务需要知道使用了哪个副本来连接回稍后再发送(因为输入错误的地址意味着连接到错误的服务)

对于旧版ASMX服务,这是通过在为服务生成的部分类上重写GetWebRequest(Uri uri)来完成的。 但是我根本不知道如何使用WCF做到这一点。

在一个不相关的SO帖子上 ,MVP @JohnSaunders建议通过接管WCF使用的整个传输机制来实现这一点。 但是我还没有弄清楚该怎么做。

这是一个棘手的问题,WCF似乎无法很好地解决这一问题。

.NET框架中唯一可以直接处理客户端地址问题的组件是ServicePoint类。 具体来说,它具有BindIPEndPointDelegate属性,可让您控制如何选择客户端IP。 该属性的文档包括以下内容:

一些负载平衡技术要求客户端使用特定的本地IP地址和端口号,而不是IPAddress.Any (对于Internet协议版本6为IPAddress.IPv6Any )和临时端口。 您的BindIPEndPointDelegate可以满足此要求。

因此,您应该能够使用以下代码修改与您的URL关联的服务点:

var servicePoint =  ServicePointManager.FindServicePoint(
    new Uri("http://contoso.com/service.svc"));

servicePoint.BindIPEndPointDelegate =
    (sp, remote, retryCount) => new IPEndPoint(address, portNumber);

显然,此类代码要求您的类具有与客户端进行通信的协议和端点地址的意识。 最好将此逻辑设置为可应用于您的客户渠道的客户行为。

您可以使用消息属性(HttpRequestMessageProperty)将HTTP标头添加到任何传出请求中。 您需要创建一个“作用域”,将属性添加到当前的“操作上下文”中,并将该属性以及所需的所有标头附加到上下文的传出消息属性中。

请看这个:

如何使用服务参考代替WCF中的Web参考来覆盖getwebrequest方法

使用此:新类:

using System.Web.Services.Protocols;
using System.Windows.Forms;
using System;

public static class ExtensionMethods
{
    public static string ApplyServerURL(this SoapHttpClientProtocol service)
    {
        try
        {
            string name = service.GetType().Name;
            return string.Format("{0}{1}.svc", Settings.Instance.ServerAddress, name);
        }
        catch
        { return string.Empty; }
    }
}

现在是这样的:

YourService us = new YourService();
us.Url = us.ApplyServerURL();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM