【发布时间】:2014-12-15 03:23:45
【问题描述】:
我有两台计算机,它们通过以太网连接,我已经建立了 WCF 连接,这一切正常,但是当我在本地 pc 上托管与我想要通信的相同的 wcf 然后执行通过通道请求 wcf,请求不会发送到远程 pc,而是发送到我的本地 pc。有没有办法强制来自频道的 wcf 请求通过特定的 ipaddress 而不仅仅是任何一个?
我将尝试解释我如何使用它:
有两台计算机,它们都相似,并且有两个网络适配器,它们具有相同的 ipaddess 并运行相同的 wcf 软件。例如,适配器 1 的 ipaddress 是:10.10.10.1,另一个适配器在同一台电脑上是 10.10.10.2,另一台电脑是相似的。现在这两台电脑需要通信,所以我在交叉示例中连接两个网络适配器:pc 1 网络适配器一个连接到 pc 2 网络适配器 2。这样它们以 2 种方式连接。因此,如果我想与一个简单的套接字从一个到另一个进行通信并通过第二个适配器返回,这一切都很好,因为我可以将一个套接字绑定到一个 IP 地址,并且它将通过它绑定到的适配器发送它。但这似乎不适用于 WCF。如果我在一台电脑上有两台主机,一台用于适配器 10.10.10.1,一台在 10.10.10.2 上用于另一台适配器,并且我向远程 pc 上的 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)
这些连接箭头是直接连接跳线!
所有网络适配器都有一个 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
}
【问题讨论】:
-
您能澄清一下...您不是说两个 IP 地址在两台计算机的 4 个 NIC 之间共享吗?例如,另一台机器有 .3 和 .4 地址吗?
-
我更新了我的帖子,两台电脑上的IP地址是一样的。并且地址像示例中一样交叉连接。
-
从您更新的图表中,除非这两台 PC 位于不同的子网中,并且中间发生了 NAT,否则这不是有效的网络设置。应唯一分配 IP 地址。如果第三台计算机尝试 ping 10.10.10.2 怎么办?你希望哪一个回应?您是否有理由尝试像这样共享 IP?可能有更好的方法来实现您的目标
-
@Basic 对不起,我忘了提到您看到的连接是直接的,所以它只是两个适配器/PC 之间的两条跳线。所以没有双重IP地址,它只是与PC的直接网络连接(IP 10.10.10.1连接到另一台PC 10.10.10.2适配器,反之)