Проблема службы WCF, когда клиент имеет несколько IP-адресов - PullRequest
1 голос
/ 17 марта 2010

Мне нужна помощь в решении проблемы, с которой я сталкиваюсь при связи клиента рабочего стола со службой WCF, размещенной на IIS.

Что я пытаюсь сделать в моем тестовом примере:

  1. На сервере размещена служба WSDualHttpBinding
  2. Клиент устанавливает для этого соединение (метод регистрации вызовов), предоставляя свой обратный вызов URI, который содержит IP-адрес клиента
  3. Как только соединение установлено, клиентское приложение запускает веб-страницу. Пользователь вводит некоторый текст в текстовое поле и нажимает кнопку Отправить. Веб-страница отправляет текст всем зарегистрированным настольным клиентам.

Проблема:

На шаге 2 ПК может иметь несколько IP-адресов (адаптер Ethernet, адаптеры обратной связи и т. Д.). Если во время регистрационного вызова IP-адрес из этого списка отправляется в URL-адресе обратного вызова, который не может быть вызван с сервера (например, IP-адрес адаптера обратной связи), возникает исключение тайм-аута. После нескольких таких попыток сервер больше не может принимать звонки от клиентов (будь то действительный IP-адрес или нет). Иногда выдается исключение «сервер слишком занят».

(Я не могу использовать полное имя компьютера в URI обратного вызова из-за проблем конфигурации DNS / WINS, из-за которых сервер не может преобразовать имя компьютера в правильный IP-адрес).

Как воспроизвести:
а. Опубликуйте сервер на IIS. Запустите клиент с другого компьютера с несколькими IP-адресами. Клиент генерирует исключения тайм-аута и программа завершается после 3 попыток б. Параметр в App.Config позволяет ввести правильный IP-адрес (IP-адрес для использования). Теперь, если программа запущена, все работает нормально.
с. Если я удалю указанный выше IP-адрес, чтобы использовать неверный IP-адрес, снова произойдет шаг a. Запустите программы 2-3 раза в этом режиме.
д. Внесите изменения, как на шаге b, и запустите программу. Иногда я получаю исключение тайм-аута. В других случаях веб-сайт появляется. Однако, когда текст вводится и отправляется, он не приходит к клиенту. (Метод регистрации работал, хотя веб-служба не получала никаких вызовов. Функция отправки не выполняется, поскольку в веб-службе нет зарегистрированных клиентов.

Я не уверен, почему именно это происходит и как с этим справиться. Вот мое решение Visual Studio - http://bit.ly/atKfOS

Высоко ценю любые материалы, комментарии. Среда: Сервер - Windows XP (IIS 5), Windows Server 2008 SP2 x64 (IIS 7), Клиент: Windows XP

Спасибо GC

1 Ответ

0 голосов
/ 17 марта 2010

Ну, я думаю, что главная проблема заключается в следующем: когда сервер пытается перезвонить клиенту и выходит из строя, канал между ними становится «неисправным» и становится бесполезным.

После такогособытие происходит, вы должны утилизировать прокси на стороне клиента и воссоздать его - или изящно обработать исключение тайм-аута на сервере (перехватить его, превратить в сбой SOAP, зарегистрировать его - что угодно) - только не пускать нефильтрованный .NETTimeoutException передается обратно клиенту, это приведет к сбою канала).

Что вы делаете на стороне сервера, когда возникает такое TimeoutException?Вы уверены, что не раздули это исключение до самого канала ??

...