WCF Discovery возвращает жестко закодированный URL - PullRequest
10 голосов
/ 18 января 2011

Общий дизайн выглядит следующим образом:

  1. Существует определенное приложение, которое устанавливается в качестве службы Windows
  2. В сети может быть несколько таких приложений
  3. Каждый из них предоставляет некоторый интерфейс к сети (его можно рассматривать как «дистанционное управление» или «конфигурация» - все это)
  4. Затем есть другое приложение, которое действует как клиент для этого интерфейса (используяте же аналогии - «удаленный контроллер» или «инструмент конфигурирования»)
  5. Цель последнего состоит в том, чтобы отследить все экземпляры первого в сети, отобразить их в виде списка для пользователя и позволить пользователюткните их в разные места, используя этот открытый интерфейс (например, «дистанционное управление» или «настройте» их)
  6. Для простоты, давайте предположим, что все находятся в одной сети - то есть каждый может слышать каждогоUDP-трансляции других.

Довольно просто, а?Раньше я создавал подобные вещи десятки лет, используя механизм обнаружения, основанный на UDP-трансляции.

Но теперь я подумал, что я буду крутым, хмелевым и пойдус заводной WCF Discovery в режиме Ad Hoc.И это работает!Кто мог сказать?: -)

Но не совсем.Как было отмечено до меня здесь и там , обнаружение возвращает жестко запрограммированный URL из конфигурации службы.То есть, если служба имеет <baseAddresses><add baseAddress="net.tcp://localhost:1234/My/Service" /></baseAddresses> в своем конфигурационном файле, именно это я и собираюсь получить от клиента обнаружения, включая часть «localhost».

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

Итак, вопрос в том, как заставить клиент обнаружения выдавать мне полезный URL вместо мусора localhost-ish?

Чтобы сэкономить время, пара мыслей, которые не работают:

  1. Изменение файла конфигурации службы во время развертывания, кодирование его реального IP-адреса или имени компьютера.
    Не работает,потому что могут измениться как IP-адрес, так и имя компьютера.
  2. Настройте службу из кода (хотя бы частично), используя текущий IP-адрес или имя компьютера для создания URL-адреса.
    Не работает.Имя машины бесполезно, поскольку в сети может отсутствовать DNS.IP бесполезен, поскольку компьютер может находиться в нескольких сетях одновременно и, следовательно, иметь несколько IP-адресов (это не гипотетически, у нас на самом деле do такая ситуация).Какой из них использовать тогда?

Другими словами, мне нужно не настраивать службу, а заставить клиента обнаружения дать мне адрес, с которого пришел ответ на обнаружение.

Ответы [ 3 ]

13 голосов
/ 21 января 2011

Это можно исправить, заменив localhost подстановочным знаком:

<baseAddresses><add baseAddress="net.tcp://*:1234/My/Service" /></baseAddresses>
3 голосов
/ 21 января 2011

Не используйте конфигурацию.

Запустите службу программно.

Вот пример добавления конечных точек программно: Programmatic_Endpoint_Configuration

И это, для сравнения: Self-hosting_and_base_addresses

0 голосов
/ 04 марта 2011

Другим вариантом, отличным от подстановочного знака, является использование разрешимого DNS-имени хоста компьютера вместо localhost.

...