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

Traduceri articole Traduceri articole
ID articol: 911816 - View products that this article applies to.
Notă Acest articol este valabil pentru Microsoft .NET Framework 2.0 și toate versiunile ulterioare.
Măriți totul | Reduceți totul

În această pagină

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):
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx

Proprietă?i

ID articol: 911816 - Ultima examinare: 29 noiembrie 2013 - Revizie: 3.0
Se aplică la:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
Cuvinte cheie: 
kbtshoot kbfix kbprogramming kbprb KB911816

Trimite?i feedback

 

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