Обработка постоянно меняющегося baseAddress в хосте WCF - PullRequest
0 голосов
/ 28 апреля 2019

Как указано в вопросе, мне нужно обработать изменяющееся свойство baseAddress хоста службы WCF.У меня есть простой объект, который содержит двоичное значение изображения.Это будет отправлено с удаленного компьютера (на самом деле множество разных) на сервер через веб-приложение на сервере, которое запрашивает определенное имя файла на основе заданных файлов в базе данных.

Для этого яЯ сделал сервис и реализовал необходимые контракты, но я застрял в элементе baseAddress в файле конфигурации сервиса.

Дилемма заключается в том, что IP-адрес удаленного компьютера является динамическим.Он изменяется примерно с 5-минутными интервалами (предоставленными извне), и машина не является частью VPN или какой-либо (меж) сети и не имеет настроенной DNS.У него только установлено имя компьютера.Однако я могу вытащить IP-адрес этого устройства из таблицы, чтобы предоставить клиентскому приложению «правильный» IP-адрес для привязки, но моя проблема скорее на стороне хоста.

Вопрос в основном- в этом описанном хосте как мне указать baseAddress, к которому будут привязываться клиенты?Я полагаю, что не могу выполнить повторную привязку каждый раз, когда обнаруживается изменение IP-адреса, или это не является проблемой?

Я попытался указать "http://localhost:6090/BasicService/", который был недоступен, когда я пытался позвонить с клиента"http://192.168.0.4:6090/BasicService/". Однако, когда я указываю точный IP-адрес на клиенте и хосте, клиент успешно связывается с хостом.

Обратите внимание, что привязка моей службы - basicHttpBinding, а частные IP-адреса находятся только в тестовой среде.При работе эти устройства получают свои IP-адреса от провайдеров m2m.

РЕДАКТИРОВАТЬ: Для лучшего понимания удаленное устройство будет сервером и содержит информацию о привязке, которая является XYZ, и XYZ - это то, что я пытаюсь выяснить.Клиент может подключиться к локальному компьютеру, чтобы получить IP-адрес определенного удаленного устройства, а затем привязать клиента к данному IP-адресу, но проблема в том, что на хосте я не уверен, что использовать в следующем:хозяинbaseAddressesadd baseAddress = "http: // ????????: 6090 /"baseAddressesхозяин

Предлагаемый ниже ответ помогает, когда эти устройства находятся в закрытой сети, и вы называете частный IP-адрес сервера, но не работает с общедоступным IP-адресом сервера.

1 Ответ

0 голосов
/ 28 апреля 2019

Существует некоторая путаница в вашем вопросе (см. Комментарии). В этом ответе я предположил, что ваши клиенты действительно знают IP-адрес вашего сервера, но ваша проблема привязывает сервер к неизвестному IP-адресу.

Серверная сторона

Для прослушивания любого IP-адреса на стороне сервера вы можете использовать IP-адрес 0.0.0.0. Таким образом, на стороне сервера вам не нужно беспокоиться о IP-адресе. Вот так:

<host>
  <baseAddresses>
    <add baseAddress="http://0.0.0.0:6090/BasicService" />
  </baseAddresses>
</host>

Клиентская сторона

А на стороне клиента вы можете сделать привязку динамической, указав ее в коде:

string ipAddress = GetIpFromTable(); // Assuming client can do this...
string url = $"http://{ipAddress}:6090/BasicService";
var binding = new BasicHttpBinding();
var address = new EndpointAddress(url);        
var client = new BasicServiceClient(binding, address);

Вы можете столкнуться с некоторыми проблемами, когда IP-адрес изменяется во время / перед запросом, поэтому убедитесь, что ваша обработка ошибок приведена в порядок, и повторите попытку, если первая попытка не удалась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...