Необработанных исключений вызывает 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 метод для вызова метода, который создает необработанное исключение.

  1. Поместите следующий код в файл с именем 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);
            }
        }
    }
    
  2. Сохраните файл UnhandledExceptionModule.cs в папку C:\Program Files\Microsoft Visual Studio 8\VC .

  3. Откройте командную строку Visual Studio.

  4. Введите sn.exe -k key.snk, а затем нажмите клавишу ВВОД.

  5. Введите csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.cs, а затем нажмите клавишу ВВОД.

  6. Введите gacutil.exe /if UnhandledExceptionModule.dll, а затем нажмите клавишу ВВОД.

  7. Введите ngen install UnhandledExceptionModule.dll, а затем нажмите клавишу ВВОД.

  8. Введите gacutil /l UnhandledExceptionModule, а затем нажмите клавишу ВВОД , чтобы отобразить строгое имя файла UnhandledExceptionModule .

  9. Добавьте следующий код в файл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.