Смешивание версий .NET между веб-сайтом и виртуальными каталогами и сообщением об ошибке «серверное приложение недоступно» - PullRequest
4 голосов
/ 07 января 2011

Предыстория
В прошлом месяце наша команда разработчиков создала новое приложение asp.net 3.5 для размещения на нашем производственном веб-сайте. Как только мы завершили работу, мы попросили группу, которая управляет сервером, скопировать приложение на наш производственный сайт и настроить виртуальный каталог как новое приложение.

27.12.2010, два публичных «Gineau Pigs» были выбраны для использования приложения, и оно отлично работало. 30.12.2010 г. мы получили уведомление от внутренних сотрудников о том, что когда этот сотрудник пытался получить доступ к приложению (это был владелец бизнес-процесса), они получили сообщение «Серверное приложение недоступно».

Когда я позвонил в группу, которая поддерживает наш сервер, мне сказали, что он, вероятно, потерпел неудачу, потому что я не закрывал соединения в своем коде. Однако эта же группа вошла, а затем создала отдельный пул приложений для этого приложения-запроса расширения. С тех пор проблем не было.

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

Технические подробности - древовидная структура нашего веб-сайта

Main Website <-- ASP Classic
         +-Virtual Directory(ExtensionRequest) <-- ASP 3.5 

Из нашей группы поддержки серверов:

'Просмотр журналов сервера и настройка сайта в IIS. Пришлось сбросить пул приложений, так как он не работал должным образом. Это исправило сайт, и теперь он снова в сети. Мы пошли дальше и создали пул приложений для веб-расширений, чтобы он был изолирован от основного пула сайтов. В прошлом мы видели, как другие приложения делали это, когда соединение оставалось открытым, а пул заполнялся. Рекомендую просмотреть код сайта, чтобы убедиться, что нет открытых соединений. '

Реальный вопрос: Что на самом деле вызвало сбой? Разве соединение не остается открытым, проблема ASP Classic? Разве приложение ExtensionRequest не нужно было бы использовать (более двух раз), чтобы соединения оставались открытыми? Скорее всего, сбой вызван тем, что они вообще не удосужились настроить новое приложение в собственном пуле приложений?

Извините за долгую скучность

Ответы [ 2 ]

2 голосов
/ 08 января 2011

Вам действительно нужно было бы получить и просмотреть журналы событий приложений и системы сервера и HTTPERR за период, когда сервер сообщал об этих ошибках.

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

Обновление:

ОП неправильно пометил свой вопрос, поэтому следующий раздел больше не применяется.Однако я оставлю это на месте, потому что я думаю, что информация полезна для тех, кто сталкивается с этими проблемами и, возможно, думает о переходе на IIS7.x.


Вы правы, что запуск двух разных .NET Framework в одном и том же пуле приложений может привести к этим ошибкам, но вы склонны видеть это в Windows 2003 / IIS6, а не в Windows 2008 / IIS7.

IIS7использует немного другой подход к указанию, какая версия .NET Framework загружается, и это определяется свойством пула приложений managedRunTimeVersion.Когда запросы обрабатываются IIS / ASP.NET, сопоставление обработчиков сайта использует атрибут preCondition, чтобы определить, когда загружать требуемый обработчик (что похоже на сопоставление сценариев в предыдущих версиях IIS).

Этот механизм предотвращает загрузку неверной версии времени выполнения в рабочий процесс пула приложений.

Так что, если пул приложений настроен для запуска .NET Framework версии 4.0, будет загружаться только эта версия, даже если ваше приложение созданопротив v2.0.

Здесь есть отличная статья о том, как это работает:

Ахтунг!Предварительные условия IIS7

Раздел, посвященный обработчикам примерно на полпути, объясняет, почему опасность случайной загрузки неправильной версии .NET в пул смягчается функцией preCondition.

Ошибка недоступности серверного приложения обычно означает, что произошло что-то катастрофическое (например, загрузка ISAPI-фильтра неправильной версии ASP.NET в уже запущенный рабочий процесс).

Не закрытие соединений SQL вряд ли вызовет такой серьезный тип ошибки.ошибка.Вы бы, скорее всего, увидели бы желтый экран ошибок времени выполнения смерти, если бы это было так.Заканчивание соединений SQL обычно не приводит к изгибу ASP.NET настолько, что вся служба превосходит саму себя.

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

Опять же, вам нужно получить журналы событий приложений и системы и журналы HTTPERR (они находятся в %systemroot%\System32\LogFiles\HTTPERR. Это будет содержать подсказки и факты о том, что пошло не так.

Обновление 2:

В Windows 2003 / IIS6, если у вас два приложения с разными версиями ASP.NET, которые находятся в одном пуле, вы будете получите эту ошибку. По моему опыту (я работаю на веб-хостера), это основная причина этой печально известной страницы ошибки:

alt text

Также есть контрольное событиезарегистрирован в журнале событий приложений:

Event Type: Error
Event Source:   ASP.NET 2.0.50727.0
Event Category: None
Event ID:   1062
Date:       12/01/2011
Time:       12:31:43
User:       N/A
Computer:   KK-DEBUG
Description:
It is not possible to run two different versions of ASP.NET in the same 
IIS process. Please use the IIS Administration Tool to reconfigure your
server to run the application in a separate process.

Хотя ваше корневое приложение может не записываться в ASP.NET, вполне вероятно, что что-то вызвало загрузку другой версии платформы в пул приложений вашего сайта.

  • в корне есть мошенник web.config ... это заставит ASP.NET загрузить
  • в картах сценариев сайта есть сопоставление с ASP.NET 1.1 (менее вероятно), но возможно)

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

0 голосов
/ 07 января 2011

Трудно сказать;Причин может быть много (слишком много используемых ресурсов, вызов за пределами .NET вызвал сбой и т. д.).Я бы посмотрел в журнале событий и посмотреть, если вы можете найти что-то там.

Если вы используете разные версии .NET, вам определенно нужны отдельные пулы.Если у вас есть возможность, я бы порекомендовал отдельные пулы для каждого приложения (даже если в одной версии .NET).

Что касается "закрытия соединения" (я предполагаю, что вы имеете в виду соединение с базой данных).Если вы создаете «низкоуровневые» соединения (например, SqlConnection, SqlCommand), убедитесь, что вы заключаете их в оператор «using», иначе ваш пул соединений может заполниться.По моему опыту, вы должны получать регулярные ошибки .NET в этом случае.Если вы используете ORM, это не должно быть проблемой.

Редактировать:

Если вы не можете найти ничего полезного в журнале событий, вы можетепопробуйте это: http://learn.iis.net/page.aspx/266/troubleshooting-failed-requests-using-tracing-in-iis-7/

...