连接尝试失败,因为连接方没有正确响应... .NET Remoting

时间:2017-06-26 10:19:33

标签: c# remoting

我在两台计算机上有两个应用程序。这些应用程序通过.NET Remoting进行通信。 第一个应用程序充当访问数据库的服务器,第二个应用程序充当客户端并将该数据写入另一个数据库。

当我的客户端在服务器上的远程对象上调用某个方法时,出现以下错误:

  

连接尝试失败,因为连接方没有   在一段时间后正确回应,或建立连接   失败,因为连接的主机无法响应   192.168.200.60:31621

嗯,这很好,但我对IP地址192.168.200.60一无所知,我正在连接到172.XXX.XXX.216。似乎有两个网络连接,它在某种程度上不利于远程连接。

我的服务器上的

ipcongif看起来像这样:

enter image description here

完全相同的解决方案适用于另外3台装有Windows 2000,Windows XP和Windows 7的计算机。服务器是在.NET Framework 2.0中开发的。

客户端和服务器具有通用DLL库,具有两个接口ICAOFactory和ICAO。首先我创建工厂CAOFactory,它有方法CreateCAO,它返回CAO对象。当我把某个方法称为ICAO对象时,它就失败了。

这是我的服务器应用程序注册远程处理对象的方式:

TcpChannel channel = new TcpChannel(31621); 
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(My_Server.CAOFactory), "My_Server", WellKnownObjectMode.Singleton);

这是我的客户端创建远程对象的方式:

My_Share.ICAOFactory srvFactory;
My_Share.ICAO srvCAO;

srvFactory = (My_Share.ICAOFactory)Activator.GetObject(typeof(Foerster_Share.ICAOFactory), "tcp://" + ip + ":" + port + "/My_Server");
srvCAO = srvFactory.CreateCAO(); // no problem
srvCAO.Init(dateTime); // problem

这是我的CAOFactory对象:

public class CAOFactory : MarshalByRefObject, ICAOFactory
{
    public ICAO CreateCAO()
    {
        ICAO CAOObj = new CAO();
        return CAOObj;
    }

    public void GetClientCount(out long clientCountSum, out long clientCountMax, out long clientCountActive)
    {
        clientCountSum = 0;
        clientCountMax = 0;
        clientCountActive = 0;
        return;
    }

    public override object InitializeLifetimeService()
    {
        return null;
    }
}

这是我的CAO对象:

public class CAO : MarshalByRefObject, ICAO
{
    public void Ping()
    {
        return;
    }

    DateTime dtInit;

    public void Init(DateTime dt)
    {
        dtInit = dt;
    }

    // + some other methods
}

任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:0)

您定位的是哪个版本的.NET?

我认为您需要使用TcpChannel类https://msdn.microsoft.com/en-us/library/bb187434(v=vs.85).aspx的bindTo属性来告诉您的服务器绑定到正确的NIC。这可能是配置中最容易完成的。您的服务器项目是否有app.config?如果没有添加一个然后添加这样的部分(这是从这个问题.Net Remoting: Indicate which local interface to use to connect to one server复制/粘贴)

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

这将告诉服务器绑定到特定的IP地址。

答案 1 :(得分:0)

重新排序网络连接优先级对我的情况有帮助。

http://ecross.mvps.org/howto/change-network-connection-priority-in-windows-10.htm

  1. 按Windows键+ X并从菜单中选择“网络连接”。
  2. 按ALT键,单击高级,然后单击高级设置。
  3. 选择网络连接,然后单击箭头以优先考虑网络连接。
  4. enter image description here

    1. 组织完网络连接优先级后,单击“确定”。现在,当连接可用时,计算机将按顺序执行。