2010-01-23 2 views
4

Я как бы в тупике с этим, и надеялся, что найду здесь несколько ответов.WCF-связь между двумя серверами сбоев после процесса обработки IIS7

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

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

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

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

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

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

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

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

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

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

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

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

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

+0

Я столкнулся с той же проблемой. Вы нашли решение? Принятый ответ, похоже, не для меня. –

ответ

4

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

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

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

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

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

+0

Я думал, что все посмотрело. В последний раз, когда я проверил, но я собираюсь дважды проверить, что я закрываю свои подключения. Я вернусь к вам. – donnovan9

+0

Не уверен, что это то, что вызывало точную проблему, но есть проблема с тем, как я закрываю канал, - использовал настроенный прокси-класс (который унаследовал от RealProxy). Я собираюсь переписать код и посмотреть, что произойдет, со временем я смогу сказать, исправлено ли это. Спасибо чувак! – donnovan9

+0

@ Konrad вы можете поделиться тем, как вы решили проблему? –

0

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

У этой ссылки может быть указатель.

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

+0

Это странно, похоже, что у одной из моих служб есть InstanceContextMode, установленный в «Single» ... все остальное - «PerCall». это может быть проблемой. – donnovan9

+0

Именно этот вопрос у нас был. Режим Single Instance, как представляется, определяет «единый» контекст. При перезапуске пула приложений он перезапускает этот контекст, но ваш клиент не знает об этом. Поэтому он отправляет новый вызов с текущим контекстом вместо запроса нового и, следовательно, ошибки. –

0

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

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

+0

Первый вариант в моей ситуации невозможен, но второй кажется все более привлекательным :) – donnovan9

Смежные вопросы