Momentan sunteți offline, așteptați să vă reconectați la internet

Excepţiile netratate provoacă ieşirea neaşteptată a aplicaţiilor bazate pe ASP.NET în .NET Framework

Notă Acest articol este valabil pentru Microsoft .NET Framework 2.0 şi toate versiunile ulterioare.
Simptome
Dacă o excepţie netratată este lansată într-o aplicaţie bazată pe ASP.NET şi creată cu .NET Framework 2.0 sau o versiune ulterioară, aplicaţia se închide în mod neaşteptat. Când apare această problemă, în jurnalul aplicaţiei nu se înregistrează nicio informaţie despre excepţie prin care să puteţi înţelege problema.

Cu toate acestea, un mesaj de eveniment similar cu următorul poate fi înregistrat în jurnalul sistemului:

Tip eveniment: Avertisment
Sursă eveniment: W3SVC
Categorie eveniment: Niciuna
ID eveniment: 1009
Data: 9/28/2005
Ora: 3:18:11
Utilizator PM: Informații indisponibile
Computer: IIS-SERVER
Descriere:
Un proces care deserveşte fondul comun de aplicații „DefaultAppPool” s-a închis în mod neaşteptat. ID-ul procesului a fost „2548”. Codul de ieşire a procesului a fost „0xe0434f4d”.

În plus, un mesaj de eveniment similar cu următorul poate fi înregistrat în jurnalul aplicaţiei:

Tip eveniment: Eroare
Sursă eveniment: Raportare eroare .NET Runtime 2.0
Categorie eveniment: Niciuna
ID eveniment: 5000
Data: 9/28/2005
Ora: 3:18:02 PM
Utilizator: Informații indisponibile
Computer: IIS-SERVER
Descriere:
EventType 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 a, P9 system.exception, P10 NIL.

Cauză
Această problemă apare deoarece politica implicită pentru excepţiile netratate s-a modificat în .NET Framework 2.0 şi versiunile ulterioare. În mod implicit, politica pentru excepţiile netratate este de a închide procesul de lucru.

În Microsoft .NET Framework 1.1 şi Microsoft .NET Framework 1.0, excepţiile netratate din firele de lucru gestionate au fost ignorate. Dacă nu aţi ataşat un depanator pentru a identifica excepţia, nu veţi realiza că a apărut o problemă.

ASP.NET utilizează politica implicită pentru excepţiile netratate în .NET Framework 2.0 şi versiunile ulterioare. Atunci când este lansată o excepție netratată, aplicaţia bazată pe ASP.NET se închide în mod neaşteptat.

Acest comportament nu este valabil pentru excepţiile care apar în contextul unei solicitări. Aceste tipuri de excepţie sunt încă tratate de un obiect HttpException. Excepţii care apar în contextul unei solicitări nu provoacă închiderea procesului de lucru. Cu toate acestea, excepţiile netratate din afara contextului unei solicitări, cum ar fi excepţiile unui fir de temporizator sau ale unui funcţii de apelare inversă, duc la închiderea procesului de lucru.
Rezoluţie
Pentru a rezolva această problemă, utilizați una dintre metodele următoare.

Metoda 1

Modificaţi codul sursă pentru obiectul IHttpModule, astfel încât să înregistreze informaţiile despre excepţii în jurnalul aplicaţiei. Informaţiile înregistrate vor include următoarele:
  • Calea directorului virtual în care a apărut excepţia
  • Numele excepţiei
  • Mesajul
  • Trasarea stivei
Pentru a modifica obiectul IHttpModule, urmaţi aceşti paşi.

Notă Acest cod va înregistra în jurnal un mesaj care conţine tipul de eveniment al erorii şi sursa evenimentului ASP.NET 2.0.50727.0 în jurnalul aplicaţiei. Pentru a testa modulul, solicitaţi o pagină ASP.NET care utilizează metoda ThreadPool.QueueUserWorkItem pentru a apela o metodă care lansează o excepţie netratată.
  1. Puneţi următorul cod într-un fişier denumit UnhandledExceptionModule.cs.
    utilizând System;utilizând System.Diagnostics;utilizând System.Globalization;utilizând System.IO;utilizând System.Runtime.InteropServices;utilizând System.Text;utilizând System.Threading;utilizând 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) {            / / Faceţi acest lucru o singură dată pentru fiecare 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,                                                              „Imposibil de localizat webengine.dll la „{0}”.  Acest modul necesită .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,                                                              " Nu există sursă EventLog numită „{0}”. Acest modul necesită .NET Framework 2.0.”,                                                               _sourceName));                        }                         AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);                         _initialized = true;                    }                }            }        }        public void Dispose() {        }        void OnUnhandledException(object o, UnhandledExceptionEventArgs e) {            // Permiteţi ca acest lucru să apară o singură dată pentru fiecare 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. Salvaţi fişierul UnhandledExceptionModule.cs în folderul următor:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Deschideţi linia de comandă Microsoft Visual Studio 2005.
  4. Tip sn.exe -k key.snk, apoi apăsaţi pe ENTER.
  5. Tip csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.cs, apoi apăsaţi pe ENTER.
  6. Tip gacutil.exe /if UnhandledExceptionModule.dll, apoi apăsaţi pe ENTER.
  7. Tip ngen install UnhandledExceptionModule.dll, apoi apăsaţi pe ENTER.
  8. Tip gacutil /l UnhandledExceptionModule, apoi apăsaţi pe ENTER pentru a afişa numele puternic pentru fişierul UnhandledExceptionModule.
  9. 9. Adăugaţi următorul cod în fişierul Web.config al aplicaţiei bazate pe ASP.NET.
    <adăugare nume="UnhandledExceptionModule" 	tip="WebMonitor.UnhandledExceptionModule, <nume puternic>" />

Metoda 2

Modificaţi politica excepţiei netratate înapoi la comportamentul implicit care are loc în .NET Framework 1.1 şi .NET Framework 1.0.

Notă Nu vă recomandăm să modificați comportamentul implicit. Dacă ignoraţi excepţiile, aplicaţia poate pierde resurse şi renunţa la blocări.

Pentru a activa acest comportament implicit, adăugaţi codul următor la fişierul Aspnet.config aflat în folderul următor:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>    <runtime>        <legacyUnhandledExceptionPolicy enabled="true" />    </runtime></configuration>
Stare
Acest comportament este cel proiectat.
Informaţii suplimentare
Pentru informaţii suplimentare despre modificările din .NET Framework 2.0, vizitați următorul site web MSDN (Microsoft Developer Network):
crash
Proprietăți

ID articol: 911816 - Ultima examinare: 11/29/2013 22:11:00 - Revizie: 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 KB911816
Feedback