0

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

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

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

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

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

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

谢谢

4

2 回答 2

0

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

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

  // Call back to the client.
}

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

于 2009-01-11T21:53:25.897 回答
0

这是令人发指的,而且不是很笼统,但应该对您有用:

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 的引用,并且需要usingsSystem.Runtime.Remoting.ChannelsSystem.Runtime.Remoting.Channels.Tcp

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


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

于 2009-01-11T22:43:42.987 回答