Event ID 1309 ASP.NET: Необработанное исключение (Unhandled Exception)
Архитектура обработки ошибок .NET и симптомы
Событие 1309 логируется в журнале Application источником ASP.NET (или ASP.NET X.X.X). Сообщение всегда содержит технический Stack Trace (дамп стека). Симптомы: пользователи веб-сайта, портала (например, Exchange OWA, MSCRM) или REST API получают в браузере "желтый экран смерти" (YSoD) или HTTP Error 500 (Internal Server Error). Это означает, что веб-приложение столкнулось с программной ошибкой (багом), которую разработчик не обернул в защитный блок try-catch, и приложение аварийно прервало обработку запроса.
Типы исключений (Exception Type) в логе 1309
| Исключение (Exception) | Где искать проблему |
|---|---|
| NullReferenceException | Баг в коде сайта. Код попытался прочитать данные из переменной, которая пуста (NULL). Верните лог разработчику. |
| SqlException / Timeout | Веб-сайт не может подключиться к базе данных. Проверьте Connection String в web.config и доступность SQL-сервера. |
| CryptographicException | Сбой проверки ViewState MAC. Сервера в кластере (NLB) не имеют единого ключа <machineKey>, либо куки пользователя устарели. |
| HttpException (Request timed out) | Скрипт выполнялся дольше лимита executionTimeout (по умолчанию 110 сек) и был убит IIS. |
Пошаговое дерево решений (Разбор Stack Trace)
Сценарий 1: Проблема криптографии в ферме (ViewState MAC)
Если 1309 спамит ошибкой "Validation of viewstate MAC failed", значит вы настроили несколько IIS серверов (Web Farm) за балансировщиком нагрузки. Клиент зашел на Сервер 1 (получил зашифрованную Cookie), а следующий запрос балансировщик кинул на Сервер 2. Сервер 2 не смог расшифровать Cookie, так как у него другой секретный ключ.
- Решение: Сгенерируйте статический
<machineKey validationKey="..." decryptionKey="..." />и пропишите его вweb.configна ВСЕХ серверах фермы одинаково.
Сценарий 2: Включение детальных ошибок (Custom Errors)
Чтобы не копаться в логах Event Viewer, покажите детальную ошибку 1309 прямо в браузере (только для тестирования!).
- Откройте
web.configсайта. - Найдите (или создайте) секцию
<system.web>. - Вставьте:
<customErrors mode="Off"/>. - Перезагрузите страницу в браузере. Вы увидите ту же красную ошибку, что и в логе.
Сценарий 3: Сбой пула подключений SQL (Max Pool Size)
Если 1309 содержит "Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool", значит код сайта открывает соединения к SQL-серверу, но забывает их закрывать (утечка соединений). Лимит пула (по умолчанию 100) исчерпан.
- Временный костыль: В Connection String добавьте
Max Pool Size=500;и перезапустите IIS. Верните баг программистам.
Типовые ошибки администраторов
- Попытка чинить код инфраструктурными методами: Сисадмин не должен "чинить" ошибку IndexOutOfRangeException. Это вина программиста. Задача сисадмина — собрать лог 1309 (Stack Trace) и отправить тикет в отдел разработки. Не тратьте часы на переустановку .NET Framework!
Траблшутинг IIS и анализ трейсов ASP.NET требует DevOps-квалификации. Возьмем вашу веб-инфраструктуру на системную поддержку: проанализируем логи приложений, устраним узкие места (I/O, SQL-таймауты), настроим балансировщики и гарантируем 100% аптайм корпоративных сайтов.
Частые вопросы (FAQ)
Приводит ли ошибка 1309 к падению всего пула (Event 5002)?
Зависит от типа исключения. Обычное 'Unhandled Exception' (в HTTP-запросе) прерывает только конкретный запрос пользователя. Но если исключение произошло в фоновом потоке (Background Thread, например, в таймере), IIS жестко завершит весь рабочий процесс w3wp.exe (Crash).
Где посмотреть логи, если 1309 обрезается в Event Viewer?
Используйте модуль Failed Request Tracing (FREB) в диспетчере IIS. Он запишет гигантский XML-файл с детальной трассировкой каждого миллисекундного шага обработки запроса.
Что значит 'Out of Memory Exception' в 1309?
Процесс w3wp.exe исчерпал лимит оперативной памяти. Если пул 32-битный, лимит составит 2-3 ГБ. Переведите пул в 64-битный режим, либо настройте регулярный Recycling пула.
Поможет ли установка актуальных версий .NET Framework?
Если код написан (скомпилирован) под .NET 4.5, то наличие на сервере .NET 4.8 не сломает его (обратная совместимость). Но если разработчик использовал функции .NET 4.8, а на сервере стоит 4.5, вы получите 1309 (Method Not Found).
Как скрыть ошибки от обычных пользователей интернета?
В web.config установите <customErrors mode="RemoteOnly"/>. Детальный 'желтый экран' увидят только те, кто зашел с локального сервера (localhost). Внешние пользователи увидят красивую страницу 500.html.