Le eccezioni non gestite causare parte di applicazioni basate su ASP.NET improvvisamente in .NET Framework 2.0

Identificativo articolo: 911816 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Quando viene generata un'eccezione non gestita in un Microsoft basate su ASP.NET viene chiuso l'applicazione basata su Microsoft .NET Framework 2.0, l'applicazione in modo imprevisto. Quando si verifica questo problema, nessuna eccezione delle informazioni è necessario comprendere il problema viene registrate nel registro dell'applicazione.

Tuttavia, potrebbe essere registrato un messaggio di evento analogo al seguente nel Registro di sistema:

Tipo evento: avviso
Origine evento: W3SVC
Categoria evento: nessuna
ID evento: 1009
Data: 28/9/2005
Ora: 3: 18: 11
PM utente: N/d
Computer: IIS-SERVER
Descrizione:
Un processo del pool di applicazioni ? DefaultAppPool ? è terminato in modo imprevisto. L'id di processo è ? 2548 ?. Codice di uscita del processo: ? 0xe0434f4d ?.

Inoltre, potrebbe essere registrato un messaggio di evento simile al seguente nel registro applicazione:

Tipo evento: errore
Origine evento: NET Runtime 2.0 segnalazione
Categoria evento: nessuna
ID evento: 5000
Data: 28/9/2005
Ora: 3: 18: 02 PM
Utente: N/d
Computer: IIS-SERVER
Descrizione:
EventType clr20r3, w3wp.exe P1, P2 6.0.3790.1830, P3 42435be1 P4 app_web_7437ep-9, P5 0.0.0.0, 433b1670 P6, P7 9, P8, P9 system.exception, P10 NIL.

Cause

Questo problema si verifica poiché in .NET Framework 2.0 è stato modificato il criterio predefinito per le eccezioni non gestite. Per impostazione predefinita, il criterio per le eccezioni non gestite è per terminare il processo di lavoro.

In Microsoft .NET Framework 1.1 e in Microsoft .NET Framework 1.0, eccezioni non gestite in thread gestiti sono state ignorate. A meno che non è collegato un debugger per rilevare l'eccezione, si potrebbe realizzare non che qualsiasi elemento non è corretto.

ASP.NET utilizza il criterio predefinito per le eccezioni non gestite in .NET Framework 2.0. Quando viene generata un'eccezione non gestita, l'applicazione basata su ASP.NET si chiude in modo imprevisto.

Questo comportamento non si applica alle eccezioni che si verificano nel contesto di una richiesta. Questi tipi di eccezioni vengono comunque gestiti e racchiuso tra un oggetto HttpException . Eccezioni che si verificano nel contesto di una richiesta non determinano il processo di lavoro alla fine. Eccezioni non gestite all'esterno del contesto di una richiesta, ad esempio le eccezioni in un thread del timer o in una funzione di callback, fanno, tuttavia, in modo che il processo di lavoro terminare.

Risoluzione

Per risolvere il problema, utilizzare uno dei seguenti metodi.

Metodo 1

Modificare il codice sorgente per l'oggetto di IHttpModule affinché registra informazioni relative all'eccezione di registro dell'applicazione. Le informazioni che vengono registrate includono le seguenti operazioni:
  • Il percorso della directory virtuale in cui si è verificata l'eccezione
  • Il nome dell'eccezione
  • Il messaggio
  • L'analisi dello stack
Per modificare l'oggetto IHttpModule , attenersi alla seguente procedura.

Nota Questo codice verrà registrato un messaggio contenente il tipo di evento di errore e l'origine eventi di ASP.NET 2.0.50727.0 nel registro dell'applicazione. Per verificare il modulo, richiesta di pagina di ASP.NET che utilizza il metodo ThreadPool.QueueUserWorkItem per chiamare un metodo che genera un'eccezione non gestita.
  1. Inserire il codice riportato di seguito in un file denominato 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. Salvare il file di UnhandledExceptionModule.cs nella seguente cartella:
    C:\Programmi\Microsoft Visual Studio 8\VC
  3. Aprire il prompt dei comandi Microsoft Visual Studio 2005.
  4. Digitare sn.exe -k key.snk e quindi premere INVIO.
  5. Digitare : Key. csc /t:library /r:system.web.dll,system.dll snk UnhandledExceptionModule.cs e quindi premere INVIO.
  6. Tipo gacutil.exe /if UnhandledExceptionModule.dll , quindi premere INVIO.
  7. Digitare ngen installare UnhandledExceptionModule.dll e quindi premere INVIO.
  8. Tipo gacutil /l UnhandledExceptionModule , quindi premere INVIO per visualizzare il nome sicuro per il file UnhandledExceptionModule .
  9. 9. Aggiungere il seguente codice al file Web.config dell'applicazione basata su ASP.NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Metodo 2

Modificare il criterio di eccezione non gestita ripristinando il comportamento predefinito che si verifica in .NET Framework 1.1 e in .NET Framework 1.0.

Nota Non è consigliabile che modificare il comportamento predefinito. Se si ignora le eccezioni, l'applicazione può essere una perdita di risorse e abbandonare i blocchi.

Per attivare questo comportamento predefinito, aggiungere il codice riportato di seguito al file Aspnet.config che si trova nella seguente cartella:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

Status

Questo comportamento legato alla progettazione.

Informazioni

Per ulteriori informazioni sulle modifiche in .NET Framework 2.0, visitare il sito di Web di MSDN (informazioni in lingua inglese):
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx

Proprietà

Identificativo articolo: 911816 - Ultima modifica: lunedì 3 dicembre 2007 - Revisione: 1.3
Le informazioni in questo articolo si applicano a:
  • Microsoft .NET Framework 2.0
Chiavi: 
kbmt kbtshoot kbfix kbprogramming kbprb KB911816 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 911816
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti