C# 强制WCF通道到ip地址

C# 强制WCF通道到ip地址,c#,wcf,binding,channel,C#,Wcf,Binding,Channel,我有两台计算机,它们通过以太网连接,我设置了WCF连接,这一切正常,但是当我在本地pc上承载与我要通信的计算机相同的WCF,然后通过通道执行WCF请求时,该请求不会发送到远程pc,而是发送到我的本地pc。是否有办法强制某个频道的wcf请求通过特定的ipaddress发送,而不只是发送到任何IP地址 我将尝试解释如何使用此选项: 有两台计算机,它们都是相似的,有两个网络适配器,它们有相同的iPad,运行相同的wcf软件。例如,适配器1的ipaddress为:10.10.10.1,同一台pc上的另一

我有两台计算机,它们通过以太网连接,我设置了WCF连接,这一切正常,但是当我在本地pc上承载与我要通信的计算机相同的WCF,然后通过通道执行WCF请求时,该请求不会发送到远程pc,而是发送到我的本地pc。是否有办法强制某个频道的wcf请求通过特定的ipaddress发送,而不只是发送到任何IP地址

我将尝试解释如何使用此选项:

有两台计算机,它们都是相似的,有两个网络适配器,它们有相同的iPad,运行相同的wcf软件。例如,适配器1的ipaddress为:10.10.10.1,同一台pc上的另一个适配器为10.10.10.2,而另一台pc类似。现在这两台pc需要通信,所以我在交叉示例中连接两个网络适配器:pc 1网络适配器1连接到pc 2网络适配器2。这使得它们以两种方式连接。因此,如果我想与一个简单的套接字进行通信,从一个到另一个,再通过第二个适配器进行通信,这一切都正常,因为我可以将套接字绑定到一个IP地址,它将通过绑定到的适配器发送。但这似乎不适用于WCF。如果我在一台电脑上有两台主机,一台用于适配器10.10.10.1,另一台用于适配器10.10.10.2,并且我向远程电脑上的10.10.10.2发送消息,它将通过第二个网络适配器进入

PC1 network adapter 1 (10.10.10.1) <--direct patch cable connection--> PC2 network adapter 2 (10.10.10.2)

PC1 network adapter 2 (10.10.10.2) <--direct patch cable connection--> PC2 network adapter 1 (10.10.10.1)
PC1网络适配器1(10.10.10.1)PC2网络适配器2(10.10.10.2)
PC1网络适配器2(10.10.10.2)PC2网络适配器1(10.10.10.1)
这些连接箭头是直接连接的插接线

所有网络适配器都有一个wcf主机,两台pc上的软件都是相同的

这一切都是为了冗余,超过两台电脑可以连接在一个链与此

这是我如何设置对远程主机的请求的一个小示例:

public void Test()
        {
            string endPoint = "net.tcp://10.10.10.2:9985/connection";

            NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);
            binding.ListenBacklog = 2000;
            binding.MaxConnections = 2000;
            binding.TransferMode = TransferMode.Buffered;
            binding.MaxReceivedMessageSize = 104857600;
            binding.SendTimeout = new TimeSpan(0, 1, 0);
            binding.CloseTimeout = new TimeSpan(0, 0, 1);
            binding.OpenTimeout = new TimeSpan(0, 0, 1);
            binding.ReceiveTimeout = new TimeSpan(0, 1, 0);
            //binding.HostNameComparisonMode = HostNameComparisonMode.Exact;
            //binding.PortSharingEnabled = false;

            ChannelFactory<Connection> pipeFactory = new ChannelFactory<Connection>(binding, new EndpointAddress(endPoint));

            var pipeProxy = this.ChannelFactory.CreateChannel();
            //fictional method: pipeProxy.SendRequestTunnelTo("10.10.10.1"); //this is the ipaddress that it should go out to however it goes out to "10.10.10.2" 
            //and this is another network adapter also on the local mashine and here is also a wcf host on

            ((IClientChannel)pipeProxy).AllowOutputBatching = true;
            ((IClientChannel)pipeProxy).Open();

            pipeProxy.SystemRequest(); //do function
        }
公共无效测试()
{
string endPoint=“net。tcp://10.10.10.2:9985/connection";
NetTcpBinding=新的NetTcpBinding(SecurityMode.None);
binding.ListenBacklog=2000;
binding.MaxConnections=2000;
binding.TransferMode=TransferMode.Buffered;
binding.MaxReceivedMessageSize=104857600;
binding.SendTimeout=新的时间跨度(0,1,0);
binding.CloseTimeout=新的时间跨度(0,0,1);
binding.OpenTimeout=newtimespan(0,0,1);
binding.ReceiveTimeout=新的时间跨度(0,1,0);
//binding.HostNameComparisonMode=HostNameComparisonMode.Exact;
//binding.PortSharingEnabled=false;
ChannelFactory pipeFactory=新ChannelFactory(绑定,新端点地址(端点));
var pipeProxy=this.ChannelFactory.CreateChannel();
//虚构的方法:pipeProxy.SendRequestTunnelTo(“10.10.10.1”);//这是它应该转到的IP地址,但它转到“10.10.10.2”
//这是本地mashine上的另一个网络适配器,这也是本地mashine上的一个wcf主机
((IClientChannel)pipeProxy).AllowOutBatching=true;
((IClientChannel)pipeProxy).Open();
pipeProxy.SystemRequest();//do函数
}

您的端点地址需要识别您的目标IP地址。

好的,这里的问题是路由。如果windows认为它可以将流量直接传送到另一个IP地址,它就会这样做

在这种情况下,它无法区分它知道的本地10.10.10.2和隐藏在NAT后面的另一个网络上的本地10.10.2

首选解决方案是不使用相同的子网(因此有10.10.10.2和10.11.10.2或类似的子网),但有时可能需要进行重大更改

下一个最好的选择是使用NAT的IP地址并将其端口转发

假设您有这样一个设置(具有2个ip地址的框是同时具有公共和内部ip的本机路由器)

然后,左侧的机器应尝试连接到5.6.7.8,这应将连接转发到右侧的机器(反之亦然,右侧的机器连接到1.2.3.4)

如果您有一个WAN设置,使机器看起来在同一个网络中,那么这和在同一个网络上一样是一个问题。网络上的任何路由器都无法确定您所指的10.10.10.2

如果您使用的IP地址不完全相同,则可以使用windows机箱上的路由表强制解决此问题。这可以允许您指定优先路由,以便给定IP地址的所有流量通过指定的NIC流出。不幸的是,超出了这一点,数据包的路由就完全取决于网络硬件了。如果您能够在中间硬件上配置路由,您可以在到达目的地的整个过程中修复路由,但这通常是一项非常繁重的工作,并且在更新/更换套件时可能会被破坏,因为它是非标准的

如果您决定研究强制路由,请从窗口开始

编辑:Re:通过接口强制路由

语法为
route add target mask gateway costmetric interfaceid

在命令提示下运行
route print
,并在输出顶部记录要使用的接口id

然后添加一条如下所示的路线:

route add 10.10.10.2 255.255.255.255 10.10.10.2 1 [interface id from above]
在我的机器上,那将是

route add 10.10.10.2 255.255.255.255 10.10.10.2 1 11
注意,在本例中,我们告诉它使用10.0.0.2作为网关。我不知道这样做的后果是什么,因为试图通过本地绑定端口访问自身的软件可能会变得非常混乱。最后一点警告:我手头没有一对物理机器可以测试这一点,虚拟机也不算什么,因为它们的网络略有不同

我们提供的成本指标为1。这应该给它一个非常高的优先级,这意味着它应该是cho
route add 10.10.10.2 255.255.255.255 10.10.10.2 1 11