Связь WCF между двумя серверами прекращается после перезапуска процесса IIS7 - PullRequest
4 голосов
/ 23 января 2010

Я немного озадачен этим и надеялся найти здесь ответы.

По сути, у меня есть приложение ASP.NET, которое работает на 2 серверах. Сервер A имеет всю бизнес-логику / доступ к данным, предоставляемый в виде веб-служб, а сервер B имеет веб-сайт, который общается с этими службами (через WCF, с привязкой net.tcp).

Проблема возникает через несколько секунд после того, как IIS на сервере A инициирует перезапуск пула приложений. Перезапуск происходит после отведенного времени (с использованием 29 часов по умолчанию, установленных в IIS).

В журнале сервера (Сервера A):

Рабочий процесс с идентификатором процесса '####' обслуживающий пул приложений 'AppPoolName' запросил переработку потому что рабочий процесс достиг своего допустимое время обработки.

Я считаю, что это нормальное поведение. Проблема в том, что через несколько секунд я получаю это исключение на сервере B:

Этот канал больше не может использоваться для отправлять сообщения в качестве сеанса вывода был автоматически закрыт из-за инициированное сервером отключение. Или отключить автоматическое закрытие, установив DispatchRuntime.AutomaticInputSessionShutdown ложь или рассмотреть возможность изменения протокол выключения с пульта сервер.

Это происходит не на каждом цикле; Я предполагаю, что это происходит, когда кто-то посещает сайт с запросом, пока происходит переработка.

Кроме того, мое заявление закрыто, пока я не вмешаюсь; это исключение продолжает возникать каждый раз, когда на страницу поступает следующий запрос. Я вмешиваюсь, редактируя файл web.config (добавляя пробел или что-то доброкачественное в конец файла) и сохраняя его - я предполагаю, что это заставляет мое приложение перекомпилироваться и восстанавливает сервисы. Я также экспериментировал с запуском командного файла, который делает это для меня каждый раз, когда происходит исключение;)

Теперь я едва мог найти информацию об этом исключении, и я некоторое время искал. Большая часть информации, которую я нашел, относится к настройкам WCF, которые я не использую.

Я уже прочитал «DispatchRuntime.AutomaticInputSessionShutdown», и я не думаю, что это относится к этой ситуации. Это конкретное свойство относится к сервису, автоматически отключающемуся в ответ на поведение на стороне клиента, что здесь не происходит. Здесь служба отключена из-за IIS.

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

Я начал играть с настройками в IIS7, в частности, включив / выключив Overlapped Recycling и увеличив время запуска / завершения процесса. Мне интересно, безопасно ли полностью отключить переработку (я полагаю, если я введу 0 для интервала времени переработки?) Но опять же, я хочу знать, что происходит!

В любом случае, если вам нужна дополнительная информация, дайте мне знать. Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 23 января 2010

Это, вероятно, связано с тем, как вы открываете и закрываете соединения WCF.

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

При перезапуске на стороне клиента (изменение web.config) новые прокси создаются на работающем сервере.

Способ исправить это - убедиться, что вы закрыли соединение WCF после его использования.

http://www.codeguru.com/csharp/.net/net_wcf/article.php/c15941/

0 голосов
/ 25 января 2010

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

Если вы не можете этого сделать, то обязательно отключите утилизацию. Переработка AppPool происходит главным образом потому, что веб-разработчики пишут дрянной код. Я знаю, что это звучит довольно тупо, но если у вас есть достаточно смысла для написания кода, который не дает утечки, то нет никаких оснований для того, чтобы IIS постоянно перезапускал вашу программу.

0 голосов
/ 25 января 2010

Вы также должны убедиться, что вы используете правильный SessionMode для своего веб-сервиса. Я помню, что у меня были похожие проблемы с некоторыми из моих Сервисов, пока я не выбрал правильный режим. Это особенно верно, когда вы смешиваете это с любым другим режимом аутентификации, который не является «Нет».

Эта ссылка может иметь некоторый указатель.

http://msdn.microsoft.com/en-us/library/ms731193.aspx

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