Я пытался найти основную причину состояния, при котором состояние сеанса ASP .NET остается заблокированным после завершения веб-запроса из-за неожиданной ошибки. Мы используем поставщик состояния сеанса SQL Server для сеанса, потому что у нас есть несколько серверов в веб-ферме. Эта проблема сначала проявилась в виде того, что многие запросы без видимых причин застревали в событии AcquireRequestState своего жизненного цикла. Мне удалось найти соответствующие записи для этих запросов в базе данных состояния сеанса на сервере SQL, которые все были заблокированы (столбец Locked = 1). Я также смог сопоставить эти запросы с записями в журнале IIS с кодами состояния HTTP 500 (с дополнительным статусом 0). Эти результаты наводят меня на мысль, что в некоторых случаях запрос был ошибочным, но НЕ снимал блокировку состояния сеанса, как должен.
Я включил отслеживание невыполненных запросов в IIS для рассматриваемого веб-сайта для кода состояния 500 со всеми доступными поставщиками, выбранными для каждого с настройкой «Подробно» для детализации. С тех пор я собрал несколько неудачных трассировок, которые привели к постоянной блокировке сеансов ASP .NET. Все они имеют одинаковые характеристики:
Проблема здесь в том, что при нормальных обстоятельствах должно быть событие RELEASE_REQUEST_STATE, которое позволит модулю сеанса снять блокировку, установленную на сеансе. Это событие пропускается в этом сценарии. Чтобы быть уверенным, я также включил трассировку неудачных запросов для кода состояния «200» и сгенерировал несколько трассировок успешных запросов, которые действительно имеют событие RELEASE_REQUEST_STATE, обрабатываемое модулем Session.
Моя теория на данный момент заключается в том, что какая-то проблема с сетью вызывает `` неправильную функцию '' и `` операция ввода-вывода была прервана из-за ошибок выхода из потока или запроса приложения '', но я не понимаю, почему это кажется чтобы заставить обработку запроса пропустить событие RELEASE_REQUEST_STATE. Если запрос прошел через REQUEST_ACQUIRE_STATE, похоже, он также должен ударить RELEASE_REQUEST_STATE. Мне неприятно говорить, что это ошибка в IIS или ASP .NET, но на данный момент мне кажется именно такой.
Могу ли я внести какие-либо изменения в конфигурацию, чтобы гарантировать, что RELEASE_REQUEST_STATE запускается при всех условиях ошибки?