Проблема со службой WCF, когда клиент имеет несколько IP-адресов

StackOverflow https://stackoverflow.com/questions/2464168

  •  20-09-2019
  •  | 
  •  

Вопрос

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

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

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

Проблема:

На шаге 2 КОМПЬЮТЕР может иметь несколько IP-адресов (адаптер Ethernet, петлевые адаптеры и т.д.).Если во время регистрационного вызова в URL обратного вызова отправляется IP-адрес из этого списка, который не может быть вызван с сервера (напримерIP-адрес адаптера обратной связи), генерируется исключение тайм-аута.После нескольких таких попыток сервер больше не может принимать вызовы от клиентов (независимо от того, действительный IP или нет).Иногда возникало исключение “сервер слишком занят”.

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

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

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

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

Спасибо GC

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top