我可以在同一台计算机上安装多个服务实例,每个实例都在不同的端口上。
如何检索当前请求所通过的端口号以区分它们?
澄清一下,如果客户正在调用以下方法:
class OrdersService : MarshalByRefObject
{
public void EnqueueOrder(Order order)
{
//int port = ??
}
}
我需要发出请求的端口号。
PS:我尝试实现IServerChannelSink接口,但它只能访问客户端的URI(如/ foo / bar)和IP地址。
由于
答案 0 :(得分:0)
如果您需要回电给客户,那么这应该是合同的一部分:
public void EnqueueOrder(Order order, IClient client)
{
// Work with the order.
// Call back to the client.
}
在客户端,您将使用派生自MarshalByRefObject的类实现IClient接口,并将其传递给EnqueueOrder方法。
答案 1 :(得分: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的引用,using
和System.Runtime.Remoting.Channels
需要System.Runtime.Remoting.Channels.Tcp
个。
当然,如果你注册了多个频道,和/或它不是TCP,和/或你有多个频道的URI,那么你必须编写比黑客作业更好的代码我上面做了,但无论如何它应该给你这个想法。
无论如何,这些单独的服务器实例是如何启动的?首先如何选择端口?客户端如何发现端口?这些问题的答案可能会揭示一种更理想的方法来区分服务器代码中的实例,例如在命令行上传递的实例标识符。