Le eccezioni non gestite da parte delle applicazioni basate su ASP.NET inaspettata nel.NET Framework

Traduzione articoli Traduzione articoli
Identificativo articolo: 911816 - Visualizza i prodotti a cui si riferisce l?articolo.
Nota.Questo articolo riguarda il Microsoft.NET Framework 2.0 e versioni successive di tutti.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Quando viene generata un'eccezione non gestita in un'applicazione ASP.NET si basa sul Microsoft.NET Framework 2.0 o versione successiva Microsoft, l'applicazione si chiude inaspettatamente. Quando si verifica questo problema, nel registro applicazioni viene registrata alcuna informazione di eccezione che è necessario disporre per la comprensione del problema.

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

Tipo di evento: avviso
Origine evento: W3SVC
Categoria evento: nessuno
ID evento: 1009
Data: 9/28/2005
Durata: 3:18:11
PM utente: n/d
Computer: SERVER IIS
Descrizione:
Interruzione imprevista di un processo del pool di applicazioni 'DefaultAppPool'. L'id di processo è '2548'. Il codice di uscita del processo è stato '0xe0434f4d'.

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

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

Cause

Questo problema si verifica perché i criteri predefiniti per le eccezioni non gestite sono stato modificato in.NET Framework 2.0 e versioni successive. Per impostazione predefinita, i criteri per le eccezioni non gestite sono alla fine del processo di lavoro.

Nel Microsoft.NET Framework 1.1 e il Microsoft.NET Framework 1.0, le eccezioni non gestite nei thread gestiti sono state ignorate. A meno che non è collegato un debugger per rilevare l'eccezione, è non sapere che qualcosa era errato.

ASP.NET utilizza il criterio predefinito per le eccezioni non gestite in.NET Framework 2.0 e versioni successive. Quando viene generata un'eccezione non gestita, l'applicazione ASP.NET viene chiuso inaspettatamente.

Questo comportamento non si applica alle eccezioni che si verificano nel contesto di una richiesta. Questi tipi di eccezioni vengono comunque gestiti e incluso in un oggetto HttpException . Le eccezioni che si verificano nel contesto di una richiesta non causano il processo di lavoro alla fine. Tuttavia, le eccezioni non gestite all'esterno del contesto di una richiesta, ad esempio le eccezioni in un thread di timer o in una funzione di callback, causano il processo di lavoro alla fine.

Risoluzione

Per risolvere questo problema, utilizzare uno dei metodi descritti di seguito.

Metodo 1

Modificare il codice sorgente per l'oggetto IHttpModule in modo che le informazioni sull'eccezione verrà registrato nel registro applicazione. Le informazioni registrate includono quanto segue:
  • Il percorso della directory virtuale in cui la exceptionoccurred
  • Il nome dell'eccezione
  • Il messaggio
  • La traccia dello stack
Per modificare l'oggetto IHttpModule , attenersi alla seguente procedura.

Nota. Questo codice verrà registrato un messaggio con il tipo di evento di errore e l'origine dell'evento di ASP.NET 2.0.50727.0 nel registro dell'applicazione. Per testare il modulo, è possibile richiedere una pagina ASP.NET che utilizza il metodo ThreadPool QueueUserWorkItem per chiamare un metodo che genera un'eccezione non gestita.
  1. Inserire il codice seguente in un file è 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. Salvare il file UnhandledExceptionModule.cs di followingfolder:
    C:\Program Files\Microsoft Visual Studio 8 \ VC
  3. Aprire la CommandPrompt Studio 2005 di Microsoft Visual.
  4. Tipo Sn.exe -k snke thenpress invio.
  5. Tipo CSC /t: library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.cse quindi pressENTER.
  6. Tipo Gacutil.exe /ifUnhandledExceptionModule.dll, quindi premere INVIO.
  7. Tipo Ngen installUnhandledExceptionModule.dll, quindi premere INVIO.
  8. Tipo Gacutil /lUnhandledExceptionModule, quindi premere INVIO per visualizzare il nome di thestrong per il file UnhandledExceptionModule .
  9. 9. Aggiungere il codice seguente al file Web. config dell'applicazione basata su yourASP.NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Metodo 2

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

Nota. Si sconsiglia di modificare il comportamento predefinito. Se si ignorano le eccezioni, l'applicazione potrebbe verificarsi perdite di risorse e abbandonare i blocchi.

Per attivare questo comportamento predefinito, aggiungere il codice seguente 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 seguente sito Web Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx

Proprietà

Identificativo articolo: 911816 - Ultima modifica: lunedì 7 ottobre 2013 - Revisione: 2.0
Le informazioni in questo articolo si applicano a:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
Chiavi: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtit
Traduzione automatica articoli
IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l?obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.
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

 

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