Такие византийские ошибки трудно отлаживать. Прослеживаемая трассировка стека не помогает в диагностике ошибки.
Во-первых, вы должны улучшить ведение журнала ошибок. В вашем global.asax
создайте реализацию хука Application_Error
, который регистрирует исключение и все внутренние исключения в файл (я бы не записывал это в базу данных, потому что соединение БД могло бы быть виновник). Убедитесь, что этот код надежен: он должен фокусироваться на этих критических ошибках, а не регистрировать каждую страницу 404 Также убедитесь, что сам код журнала не создает проблем (он должен быть очень устойчивым к ошибкам).
Причиной возникновения подобных проблем обычно является доступ к некоторым статическим переменным. Я считаю, что из всех ключевых слов static
является самым опасным, потому что оно очень тонкое.
Некоторые распространенные ошибки, которые я видел.
Кэширование Кто-то хотел быть умным и кэшировать некоторые данные в статическом словаре или около того. К сожалению, код блокировки некорректен. Исключение возникает только в том случае, если код какого-то пользователя пытается добавить sth. в кеш, но он уже есть:
if(_dict.ContainsKey(cacheKey) == false)
{
// second thread adds data to the dictionary here
_dict.Add(cacheKey, cacheData); // exception
}
Это также может произойти в сторонней библиотеке, которая использует кэширование или пул. Доступ к статическим переменным с осторожностью.
Необычные пути к коду Происходит нечто необычное, когда код вызывается не очень часто, и этот код ошибочен. Если у вас есть тестирование с высоким охватом кода, проверьте места, которые не охвачены тестами.
Потеря соединения с БД Сброс сокета на соединении БД может привести к исключениям. Многие библиотеки / драйверы подключений к базам данных исправляют это быстро (то есть следующий запрос будет в порядке). Это трудно справиться; в основном это не должно происходить, но есть много причин, почему это может произойти.