необроблена виняткова ситуація викликати програм на базі ASP.NET несподіване у .NET Framework

Переклади статей Переклади статей
Номер статті: 911816 - Показ продуктів, яких стосується ця стаття.
Примітка.Ця стаття відноситься до Microsoft .NET Framework 2.0 і все пізнішими версіями.
Розгорнути все | Згорнути все

На цій сторінці

Ознаки

Коли виникла необроблена виняткова ситуація кинуті в Microsoft ASP.NET-додаток, побудований на Microsoft .NET Framework 2.0 або пізнішої версії, застосування несподівано завершує роботу. Коли ця проблема виникає, інформація не виняток, що ви повинні мати до розуміння питання записується в журналі застосунку.

Однак, в журналі системних подій реєструється подія протокол IMAP, подібне до нижченаведеного:

Тип події: попередження
Джерело події: W3SVC
Категорія події: жоден
Код події: 1009
Дата: 9/28/2005
Час: 3:18:11
М. користувач: н/д
Комп'ютер: IIS-сервер
Опис/контроль:
Неочікуване завершення процесу, яка виступає пул застосунків 'DefaultAppPool'. Ідентифікатор процесу була '2548'. Код завершення процесу була '0xe0434f4d'.

Крім того, у журналі застосунків реєструється подія протокол IMAP, подібне до нижченаведеного:

Тип події: помилка
Джерело події: .NET звітування про помилки часу виконання 2.0
Категорія події: жоден
Код події: 5000
Дата: 9/28/2005
Час: 3:18:02 вечора
Користувач: н/д
Комп'ютер: 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 P9 system.exception, P10 дорівнює НУЛЮ.

причина

Ця проблема виникає тому, що політики за промовчанням для необроблена виняткова ситуація змінилося в .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
  • Ім'я виняток
  • протокол IMAP
  • Трасування стека
Щоб змінити IHttpModule об'єкта, виконайте такі інтерактивні елементи.

Примітка. Цей код буде реєструвати протокол IMAP, яке має тип події Помилки та події джерело 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 відомості Visual Studio 8\VC
  3. Відкрити Microsoft Visual Studio 2005 CommandPrompt.
  4. Тип SN.exe key.snk -kі thenpress ENTER.
  5. Тип ЗАТ /t:library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.csа потім pressENTER.
  6. Тип gacutil.exe /ifUnhandledExceptionModule.dll, а потім натисніть клавішу ENTER.
  7. Тип NGEN installUnhandledExceptionModule.dll, а потім натисніть клавішу ENTER.
  8. Тип gacutil /lUnhandledExceptionModule, і натисніть клавішу ENTER, щоб відобразити thestrong ім'я для файлу UnhandledExceptionModule .
  9. 9. Додайте наступний код у файлі web. config yourASP.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 перейдіть на веб-сайт корпорації Майкрософт розробник глобальна мережа (MSDN):
http://msdn2.Microsoft.com/EN-US/netframework/aa570326.aspx

Властивості

Номер статті: 911816 - Востаннє переглянуто: 9 жовтня 2013 р. - Редакція: 3.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 KbMtuk
Машинний переклад
ВАЖЛИВО! Ця стаття перекладена засобами машинного перекладу Microsoft. Статтю можна редагувати в середовищі Community Translation Framework (CTF). Щоб якомога швидше перекласти всі статті у своїй базі знань різними мовами, компанія Microsoft не лише звертається до професійних перекладачів, але й вдається до машинного перекладу, який потім редагується спільнотою. Такі статті можуть містити лексичні, синтаксичні та граматичні помилки. Microsoft не несе відповідальності за будь-які неточності, помилки або збитки, до яких може призвести неправильний переклад статей або їх використання. Докладніше про CTF див. на веб-сторінці http://support.microsoft.com/gp/machine-translation-corrections/uk-ua.
Клацніть тут, щоб переглянути цю статтю англійською мовою: 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