Необработанных исключений вызывает asp. Приложения на основе NET неожиданно завершаются в платформа .NET Framework
Эта статья поможет вам устранить проблему, из-за которой необработанных исключений возникает ошибка ASP. Приложения на основе NET неожиданно завершаются в платформа .NET Framework.
Исходная версия продукта: платформа .NET Framework 4.5
Исходный номер базы знаний: 911816
Примечание.
Эта статья относится к Microsoft платформа .NET Framework 2.0 и всем более поздним версиям.
Симптомы
При возникновении необработанного исключения в ASP. Приложение на основе NET, созданное на основе платформа .NET Framework 2.0 и более поздних версий, неожиданно завершает работу. При возникновении этой проблемы никакие сведения об исключении, необходимые для понимания проблемы, не регистрируются в журнале приложений.
Однако сообщение о событии, аналогичное приведенному в следующем примере, может быть зарегистрировано в системном журнале. Кроме того, сообщение о событии, аналогичное приведенному в следующем примере, может быть зарегистрировано в журнале приложений.
Причина
Эта проблема возникает из-за изменения политики по умолчанию для необработанных исключений в платформа .NET Framework 2.0 и более поздних версиях. По умолчанию политика необработанных исключений заключается в завершении рабочего процесса.
В платформа .NET Framework 1.1 и в платформа .NET Framework 1.0 необработанных исключений в управляемых потоках пропускались. Если вы не подключили отладчик для перехвата исключения, вы не поймете, что что-то не так.
ASP.NET использует политику по умолчанию для необработанных исключений в платформа .NET Framework 2.0 и более поздних версиях. При возникновении необработанного исключения ASP. Приложение на основе NET неожиданно завершает работу.
Это поведение не применяется к исключениям, возникающим в контексте запроса. Эти типы исключений по-прежнему обрабатываются и упаковываются HttpException
объектом. Исключения, возникающие в контексте запроса, не приводят к завершению рабочего процесса. Однако необработанных исключений вне контекста запроса, таких как исключения в потоке таймера или в функции обратного вызова, рабочий процесс завершается.
Решение 1
Измените исходный код объекта таким IHttpModule
образом, чтобы он занося сведения об исключениях в журнал приложений. Регистрируются следующие сведения:
- Путь к виртуальному каталогу, в котором произошло исключение
- Имя исключения
- Сообщение
- Трассировка стека
Чтобы изменить IHttpModule
объект , выполните следующие действия.
Примечание.
Этот код зановит в журнал приложения сообщение с типом события ошибки и источником событий ASP.NET 2.0.50727.0 . Чтобы протестировать модуль, запросите страницу ASP.NET, которая использует ThreadPool.QueueUserWorkItem
метод для вызова метода, который создает необработанное исключение.
Поместите следующий код в файл с именем UnhandledExceptionModule.cs.
using System; using System.Diagnostics; using System.Globalization; using System.IO; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Web; namespace WebMonitor { public class UnhandledExceptionModule: IHttpModule { static int _unhandledExceptionCount = 0; static string _sourceName = null; static object _initLock = new object(); static bool _initialized = false; public void Init(HttpApplication app) { // Do this one time for each AppDomain. if (!_initialized) { lock (_initLock) { if (!_initialized) { string webenginePath = Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "webengine.dll"); if (!File.Exists(webenginePath)) { throw new Exception(String.Format(CultureInfo.InvariantCulture, "Failed to locate webengine.dll at '{0}'. This module requires .NET Framework 2.0.", webenginePath)); } FileVersionInfo ver = FileVersionInfo.GetVersionInfo(webenginePath); _sourceName = string.Format(CultureInfo.InvariantCulture, "ASP.NET {0}.{1}.{2}.0", ver.FileMajorPart, ver.FileMinorPart, ver.FileBuildPart); if (!EventLog.SourceExists(_sourceName)) { throw new Exception(String.Format(CultureInfo.InvariantCulture, "There is no EventLog source named '{0}'. This module requires .NET Framework 2.0.", _sourceName)); } AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException); _initialized = true; } } } } public void Dispose() { } void OnUnhandledException(object o, UnhandledExceptionEventArgs e) { // Let this occur one time for each AppDomain. if (Interlocked.Exchange(ref _unhandledExceptionCount, 1) != 0) return; StringBuilder message = new StringBuilder("\r\n\r\nUnhandledException logged by UnhandledExceptionModule.dll:\r\n\r\nappId="); string appId = (string) AppDomain.CurrentDomain.GetData(".appId"); if (appId != null) { message.Append(appId); } Exception currentException = null; for (currentException = (Exception)e.ExceptionObject; currentException != null; currentException = currentException.InnerException) { message.AppendFormat("\r\n\r\ntype={0}\r\n\r\nmessage={1} \r\n\r\nstack=\r\n{2}\r\n\r\n", currentException.GetType().FullName, currentException.Message, currentException.StackTrace); } EventLog Log = new EventLog(); Log.Source = _sourceName; Log.WriteEntry(message.ToString(), EventLogEntryType.Error); } } }
Сохраните файл UnhandledExceptionModule.cs в папку
C:\Program Files\Microsoft Visual Studio 8\VC
.Откройте командную строку Visual Studio.
Введите
sn.exe -k key.snk
, а затем нажмите клавишу ВВОД.Введите
csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.cs
, а затем нажмите клавишу ВВОД.Введите
gacutil.exe /if UnhandledExceptionModule.dll
, а затем нажмите клавишу ВВОД.Введите
ngen install UnhandledExceptionModule.dll
, а затем нажмите клавишу ВВОД.Введите
gacutil /l UnhandledExceptionModule
, а затем нажмите клавишу ВВОД , чтобы отобразить строгое имя файла UnhandledExceptionModule .Добавьте следующий код в файлWeb.config ASP. Приложение на основе NET.
<add name="UnhandledExceptionModule" type="WebMonitor.UnhandledExceptionModule, <strong name>" />
Решение 2
Измените политику необработанных исключений обратно на поведение по умолчанию, которое происходит в платформа .NET Framework 1.1 и в платформа .NET Framework 1.0.
Примечание.
Не рекомендуется изменять поведение по умолчанию. Если игнорировать исключения, приложение может утечь ресурсы и отказаться от блокировок.
Чтобы включить это поведение по умолчанию, добавьте следующий код в файлAspnet.config , расположенный в следующей папке:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
<runtime>
<legacyUnhandledExceptionPolicy enabled="true" />
</runtime>
</configuration>
Статус
Такое поведение является особенностью данного продукта.
Дополнительная информация
Дополнительные сведения об изменениях в платформа .NET Framework 2.0 см. в разделе Критические изменения в платформа .NET Framework 2.0.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по