【问题标题】:Port of current call in RemotingRemoting 中当前调用的端口
【发布时间】:2009-01-11 21:38:19
【问题描述】:

在同一台计算机上可以有多个我的服务实例,每个实例都在不同的端口上。

如何检索当前请求通过的端口号以区分它们?

澄清一下,如果客户端正在调用以下方法:

class OrdersService : MarshalByRefObject
{
    public void EnqueueOrder(Order order)
    {
        //int port = ??
    }
}

我需要发出请求的端口号。

PS:我尝试实现 IServerChannelSink 接口,但它只能访问客户端的 URI(如 /foo/bar)和 IP 地址。

谢谢

【问题讨论】:

    标签: .net remoting port


    【解决方案1】:

    如果您需要回电给客户,那么这应该是您合同的一部分:

    public void EnqueueOrder(Order order, IClient client)
    {
      // Work with the order.
    
      // Call back to the client.
    }
    

    在客户端,您将使用派生自 MarshalByRefObject 的类实现 IClient 接口,并将其传递给 EnqueueOrder 方法。

    【讨论】:

      【解决方案2】:

      这是令人发指的,不是很笼统,但应该适合你:

      TcpChannel       channel = (TcpChannel)ChannelServices.RegisteredChannels[0];
      ChannelDataStore data    = (ChannelDataStore)channel.ChannelData;
      string           uri     = data.ChannelUris[0];
      int              port    = int.Parse(uri.Substring(uri.LastIndexOf(':')));
      

      请注意,您需要对 System.Runtime.Remoting.dll 的引用,并且对于 System.Runtime.Remoting.ChannelsSystem.Runtime.Remoting.Channels.Tcp,您需要 usings。

      当然,如果您注册了多个通道,和/或它不是 TCP,和/或您有多个用于通道的 URI,那么您必须编写比我的 hack-job 更好的代码上面做了,但无论如何它应该给你这个想法。


      这些单独的服务器实例是如何启动的呢?首先如何选择端口?客户端如何发现端口?这些问题的答案可能会揭示一种更理想的方法来区分服务器代码中的实例,例如在命令行中传递的实例标识符。

      【讨论】:

        猜你喜欢
        • 2011-01-25
        • 2015-08-06
        • 2015-03-07
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 2019-08-13
        • 2022-01-22
        • 2013-05-03
        相关资源
        最近更新 更多