C# .Net远程处理:指示用于连接到一台服务器的本地接口

C# .Net远程处理:指示用于连接到一台服务器的本地接口,c#,.net,communication,.net-remoting,C#,.net,Communication,.net Remoting,我们有一个与.Net远程处理连接的服务器 服务器在两个网络上,客户端在两个网络上。客户端和服务器只有一个共同的网络: 使用发现,我们可以找到服务器的IP(在本例中为10.10.10.110)。我们创建TcpChannel,然后连接到服务器 服务器接收呼叫,但当它试图向客户端接收器发送一些信息时。我们得到一个异常,说我们试图将数据发送到一个不可检查的IP(10.12.10.100) 所以服务器正确地宣布了他的地址,但是我们如何向客户端指示使用具有特定IP的网络接口呢 一些代码: 客户端,初始化:

我们有一个与.Net远程处理连接的服务器

服务器在两个网络上,客户端在两个网络上。客户端和服务器只有一个共同的网络:

使用发现,我们可以找到服务器的IP(在本例中为10.10.10.110)。我们创建
TcpChannel
,然后连接到服务器

服务器接收呼叫,但当它试图向客户端接收器发送一些信息时。我们得到一个异常,说我们试图将数据发送到一个不可检查的IP(10.12.10.100)

所以服务器正确地宣布了他的地址,但是我们如何向客户端指示使用具有特定IP的网络接口呢

一些代码:

客户端,初始化:

IDictionary tcpChannelConfiguration = new Hashtable();
string instanceName = "RemotingClient" + Utils.GenerateRandomString(5);
tcpChannelConfiguration["name"] = instanceName);
tcpChannelConfiguration["port"] = 0;
tcpChannelConfiguration["machineName"] = m_interfaceToHost;//This is containing the local interface to use
tcpChannelConfiguration["bindTo"] = m_interfaceToHost;
IClientChannelSinkProvider formatClient = new BinaryClientFormatterSinkProvider(tcpChannelConfiguration, null);
IClientChannelSinkProvider identityFormatClient = new IdentityClientSinkProvider{Next = formatClient};
BinaryServerFormatterSinkProvider formatServer = new BinaryServerFormatterSinkProvider(tcpChannelConfiguration, null)
{TypeFilterLevel = TypeFilterLevel.Full};
m_channel = new TcpChannel(tcpChannelConfiguration, identityFormatClient, formatServer);
ChannelServices.RegisterChannel(m_channel, false);

//Then we get the remote object:
IServer server  = (IServer)Activator.GetObject(typeof(IServer), String.Format("tcp://{0}:{1}/{2}", m_ipAddress, m_port, instanceName));
[...]
以下是我在服务器端遇到的例外情况:

System.Net.Sockets.SocketException (0x80004005): A socket operation was attempted to an unreachable network 10.12.10.100:54330

Server stack trace: 
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
   at System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket(EndPoint ipEndPoint)
   at System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket()
   at System.Runtime.Remoting.Channels.RemoteConnection.GetSocket()
   at System.Runtime.Remoting.Channels.SocketCache.GetSocket(String machinePortAndSid, Boolean openNew)
   at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWithRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream)
   at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
   at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)
我如何向客户端指示它必须向服务器提供哪个IP/接口

我们是否可以通过提供一个定制的
ClientSinkProvider

编辑

我发现了一些可能很有趣的东西,我注意到对于简单的查询响应,.Net远程处理可以正常工作,但对于其中一些查询,查询提供了一个对象,该对象将被服务用作回调,在这种情况下,它不起作用

我刚刚获得了.Net的源代码来检查这是如何完成的,但我还没有找到相反方向的代理的创建

虽然有TcpChannel的源代码,但我看到在某些时候,服务器端的方法(将在客户端上建立到回调的连接)接收到标头中具有正确远程IP的请求,但在URI中具有错误的IP:

几年前我编写了一些远程应用程序,尽管我没有得到这个确切的错误,但我的理解是服务器试图通过连接回客户端返回结果,但使用了错误的IP

如果明确指定客户端用于与服务器通信的IP,会发生什么情况?尝试将以下内容添加到clients.config文件:

<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
                <channel ref="tcp" port="0" bindTo="10.10.10.100" />
            </channels>
        </application>
    </system.runtime.remoting>
</configuration>


这应确保连接和流量通过请求的IP路由,而不是使用10.12.10.100进行连接[如果该网络有一些平均值达到10.11.x.x而不通过10.10.x.x],则这可能会准确工作]

我们最后得到了
tcpcchannel
的代码,基本上,我们存储了源IP地址,它存储在头文件中,然后我们替换了
IChannelDataStore
中的URI。此外,我们还确保客户端侦听具有相同端口的每个地址。有点像黑客,但它让我们摆脱了麻烦…

重新排序网络连接优先级在我的案例中有所帮助

  • 按Windows键+X并从菜单中选择网络连接
  • 按ALT键,单击高级,然后单击高级设置
  • 选择网络连接并单击箭头以优先考虑网络连接
  • 完成网络连接优先级的组织后,单击“确定”。现在,当连接可用时,计算机将遵循命令

  • 您是否尝试将
    绑定添加到
    设置@rene是的,但正如规范所述:“此属性只能在服务器端使用。”好吧,这可能有点不对劲,但在服务器上的路由表中添加一条路由,以便为该IP使用特定的NIC如何?只是为了验证这只是一个路由问题。@rene:我不是networkink的专业人员,但你会怎么做?这是可以通过我们的.Net应用程序实现的吗?我们必须为每个客户机都这样做吗?(因为我们不知道所有的客户机)实际上,由于问题发生在服务器向客户机发送响应时,您可以在问题中包含一些服务器端代码。不幸的是,我们的配置是代码(而不是XML),但是我们尝试将
    bindTo
    machineName
    设置为预期的IP,但仍然不起作用:(我更新了示例以显示itI是如何看到的。也许您可以尝试更改Windows中的NIC顺序,使系统首先尝试使用正确的网络?就像这样:是的,我们昨天刚刚尝试过,但没有帮助,我们获得了一次成功,但再次失败(恢复此操作也有相同的行为).Hmm.那么下一步要尝试的可能是提升通道优先级?tcpChannelConfiguration[“priority”]=99;我会检查一下(但我只有一个通道,所以不确定它是否有影响)