Необработанные исключения вызывают приложений на основе ASP.NET неожиданно в платформа.NET Framework

Переводы статьи Переводы статьи
Код статьи: 911816 - Vizualiza?i produsele pentru care se aplic? acest articol.
ПримечаниеДанная статья относится к Microsoft платформа.NET Framework 2.0 и всех более поздних версий.
Развернуть все | Свернуть все

В этой статье

Проблема

Когда необработанное исключение в Microsoft приложения ASP.NET, которое строится на Microsoft платформа.NET Framework 2.0 или более поздней версии, приложение неожиданно завершает работу. При возникновении этой проблемы в журнале приложений регистрируется не сведения об исключении, которые необходимы для понимания проблемы.

Тем не менее в журнале системы регистрируется сообщение, подобное следующему:

Тип события: предупреждение
Источник события: W3SVC
Категория события: нет
Код события: 1009
Дата: 9/28/2005
Время: 3:18:11
PM пользователь: н/д
Компьютер: Сервер IIS
Описание:
Процесс, обслуживающий группу приложений «DefaultAppPool» неожиданно прервана. Идентификатор процесса: «2548». Код выхода процесса был «0xe0434f4d».

Кроме того в журнале приложений регистрируется сообщение, подобное следующему:

Тип события: ошибка
Источник события: .NET 2.0 среда выполнения сообщения об ошибках
Категория события: нет
Код события: 5000
Дата: 9/28/2005
Время: 3:18:02 PM
Пользователь: н/д
Компьютер: Сервер IIS
Описание:
Clr20r3 тип события P1 w3wp.exe, P2 6.0.3790.1830 P3 42435be1, P4 app_web_7437ep-9, P5 0.0.0.0, P6 433b1670, P7 9, P8 system.exception, P9, P10 NIL.

Причина

Эта проблема возникает из-за политики по умолчанию для необработанных исключений в платформа.NET Framework 2.0 и более поздних версий. По умолчанию политики для необработанных исключений является для завершения рабочего процесса.

В Microsoft платформа.NET Framework 1.1 и Microsoft платформа.NET Framework 1.0 необработанные исключения в управляемых потоках были проигнорированы. Если вы присоединен отладчик для перехвата исключения, будет не осознают, что-то неверно.

ASP.NET использует политику по умолчанию для необработанных исключений в платформа.NET Framework 2.0 и более поздних версий. Когда возникает необработанное исключение, приложения на основе ASP.NET неожиданно завершает работу.

Это поведение не применяется для исключений, возникающих в контексте запроса. Такого рода исключения по-прежнему обрабатываются и перезаписанный объект HttpException . Рабочий процесс до конца не вызывают исключения, возникающие в контексте запроса. Однако необработанные исключения вне контекста запроса, например исключения в потоке таймера или в функции обратного вызова, вызвать рабочий процесс до конца.

Решение

Чтобы устранить эту проблему, используйте один из следующих методов.

Способ 1

Измените исходный код для объекта IHttpModule , в журнал приложений заносится информация об исключении. Информацию, регистрируемую будет включать следующее:
  • Путь к виртуальному каталогу, в котором exceptionoccurred
  • Имя исключения
  • Сообщение
  • Трассировка стека
Чтобы изменить объект IHttpModule , выполните следующие действия.

Примечание Этот код будет войти в сообщение, которое имеет тип события ошибки и ASP.NET 2.0.50727.0 источник событий в журнале приложений. Для тестирования модуля, запросите страницу ASP.NET, которая использует метод ThreadPool.QueueUserWorkItem вызов метода, который выдает необработанное исключение.
  1. Поместите следующий код в файл namedUnhandledExceptionModule.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 в followingfolder:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Откройте CommandPrompt Microsoft Visual Studio 2005.
  4. Введите Sn.exe key.snk -kи thenpress ввод.
  5. Введите CSC /t:library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.cs, а затем pressENTER.
  6. Введите Gacutil.exe /ifUnhandledExceptionModule.dll, а затем нажмите клавишу ВВОД.
  7. Введите NGen installUnhandledExceptionModule.dll, а затем нажмите клавишу ВВОД.
  8. Введите Gacutil /lUnhandledExceptionModule, а затем нажмите клавишу ВВОД, чтобы отобразить имя файла UnhandledExceptionModule thestrong.
  9. 9. Добавьте следующий код в файл Web.config приложения yourASP.NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Способ 2

Измените политику необработанных исключений на поведение по умолчанию, которое происходит в платформа.NET Framework 1.1 и 1.0 платформа.NET Framework.

Примечание Не рекомендуется изменять поведение по умолчанию. Если пропустить исключения, приложение может вызвать утечку ресурсов и отмену блокировки.

Чтобы включить это поведение по умолчанию, добавьте следующий код в файле Aspnet.config, расположенный в следующей папке:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

Статус

Данное поведение является нормальным.

Дополнительная информация

Дополнительные сведения об изменениях в платформа.NET Framework 2.0 посетите следующий веб-узел Microsoft Developer Network (MSDN):
http://msdn2.Microsoft.com/en-US/netframework/aa570326.aspx

Свойства

Код статьи: 911816 - Последний отзыв: 10 октября 2013 г. - Revision: 7.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
Ключевые слова: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.
Эта статья на английском языке: 911816

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com