Порт текущего звонка в Remoting - PullRequest
0 голосов
/ 12 января 2009

На одном компьютере может быть несколько экземпляров моего сервиса, каждый из которых имеет свой порт.

Как я могу получить номер порта, с которого поступил текущий запрос, чтобы отличить их?

Чтобы уточнить, вызывает ли клиент следующий метод:

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

Мне нужен номер порта, с которого был сделан запрос.

PS: я попытался реализовать интерфейс IServerChannelSink, но он может получить доступ только к URI (например, / foo / bar) и IP-адресу клиента.

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 января 2009

Это отвратительно и не очень обобщенно, но должно работать для вас:

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 s для System.Runtime.Remoting.Channels и System.Runtime.Remoting.Channels.Tcp.

Конечно, если у вас зарегистрировано более одного канала, и / или это не TCP, и / или у вас более одного URI для канала, вам придется писать код лучше, чем хакерское задание I сделал выше, но это должно дать вам идею, в любом случае.


Как запускаются эти отдельные экземпляры сервера? Как порт выбирается в первую очередь? Как клиент обнаруживает порт? Ответы на эти вопросы могут раскрыть более идеальный способ различения экземпляра в коде сервера, например идентификатор экземпляра, передаваемый в командной строке.

0 голосов
/ 12 января 2009

Если вам требуется перезвонить клиенту, это должно быть частью вашего контракта:

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

  // Call back to the client.
}

На стороне клиента вы бы реализовали интерфейс IClient с классом, производным от MarshalByRefObject, и передали бы его в метод EnqueueOrder.

...