【问题标题】:Remoting call never returns远程调用永不返回
【发布时间】:2014-03-06 13:26:01
【问题描述】:

我有一个 Windows 服务,它在同一台机器上生成一个子进程。它们通过 TCP 远程处理以两种方式进行通信。子进程 ping 父进程没有问题,但是从父进程的客户端对子进程远程服务的 ping 调用永远不会返回。

日志显示子进程使用预期的端口和服务名称注册服务器通道。但是,我提供 127.0.0.1 作为主机,但是在查看 ChannelData 中的 uri 值时,我看到的是机器的实际 IP 地址而不是环回地址。用这个实际的 ip 地址而不是 127.0.0.1 注册孩子的服务器通道没有区别。

Netstat 表明预期的端口正在监听:

TCP   0.0.0.0:23167   pc-name:0   LISTENING   hostingProcId
TCP   0.0.0.0:23461   pc-name:0   LISTENING   hostedProcId

服务是 WellKnownObjectMode.Singleton。我不知道以下信息是否重要,但以防万一,我没有覆盖可编组对象的 InitializeLifetimeService。

将 secure=false 添加到 cahnnel 属性并没有解决问题,也没有在相关端口上显式设置进出防火墙规则。

我同步跨进程以确保客户端在子进程完全设置之前不会尝试激活远程对象。

有什么想法吗?

在父节点上设置客户端:

protected RemotingTcpClient(IpcUniplexConfig config)
{
    Host = config.Host;
    Port = config.Port;
    ServiceName = config.ServiceName;

    var props = new Hashtable();
    props["name"] = ServiceName;
    props["timeout"] = config.Timeout;        

    Channel = new TcpClientChannel(props, null);
    ChannelServices.RegisterChannel(Channel, true);

    var uri = string.Format("tcp://{0}:{1}/{2}", Host, Port, ServiceName);           
    Service = (TService)Activator.GetObject(typeof(TService), uri);
}

父级上的客户端:

public IpcCallResponseData PingHostedProcess(int processId)
{
    return Service.Ping(new IpcCallRequestData(processId));
}

子服务器设置:

protected RemotingTcpServer(IpcUniplexConfig config, TService service, WellKnownObjectMode objectMode)
{
    Port = config.Port;
    Service = service;

    var props = new Hashtable();
    props["port"] = Port;
    props["name"] = service.ServiceName;

    Channel = new TcpServerChannel(props, null);
    ChannelServices.RegisterChannel(Channel, true);
    RemotingConfiguration.RegisterWellKnownServiceType(Service.GetType(), Service.ServiceName, objectMode);
}

对孩子的服务:

public IpcCallResponseData Ping(IpcCallRequestData data)
{
    ... some processing ...
    return new IpcCallResponseData(_processId);
}

【问题讨论】:

    标签: c# .net ipc remoting


    【解决方案1】:

    如果您想要双向通信,那么您的客户端和服务器都需要注册客户端和服务器通道。

    希望如果您在RemotingTcpServer 中创建并注册TcpClientChannel,然后在RemotingTcpClient 中创建并注册TcpServerChannel,它可能会在同一端口上侦听它!

    【讨论】:

    • 当然可以,双方注册一个服务器和一个客户端。我只粘贴了与有问题的方向相关的代码,以免用不相关的代码弄乱我的问题
    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多