Unbehandelte Ausnahmen führen ASP.NET basierende Anwendungen in das.NET Framework unerwartet beendet

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 911816 - Produkte anzeigen, auf die sich dieser Artikel bezieht
HinweisDieser Artikel bezieht sich auf die Microsoft.NET Framework 2.0 und alle späteren Versionen.
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn eine nicht behandelte Ausnahme in einer Microsoft ASP.NET basierten Anwendung ausgelöst wird, die auf der Microsoft.NET Framework 2.0 oder eine höhere Version erstellt wird, wird die Anwendung unerwartet beendet. Wenn dieses Problem auftritt, wird keine Informationen über die Ausnahme, die für das Verständnis des Problems im Anwendungsprotokoll protokolliert.

Jedoch kann eine Ereignismeldung, die der folgenden ähnelt im Systemprotokoll protokolliert werden:

Ereignistyp: Warnung
Quelle: W3SVC
Ereigniskategorie: keine
Ereignis-ID: 1009
Datum: 9/28/2005
Dauer: 3:18:11
PM-Benutzer: n/a
Computer: IIS-SERVER
Beschreibung:
Ein Prozess für Anwendungspool 'DefaultAppPool' wurde unerwartet beendet. Die Prozesskennung lautet '2548'. Der Prozessexitcode lautet ' 0xe0434f4d '.

Darüber hinaus kann eine Meldung, die der folgenden ähnelt im Anwendungsprotokoll protokolliert werden:

Ereignistyp: Fehler
Quelle: .NET Runtime 2.0-Fehlerberichterstattung
Ereigniskategorie: keine
Ereignis-ID: 5000
Datum: 9/28/2005
Zeit: 18:02 Uhr
Benutzer: n/a
Computer: IIS-SERVER
Beschreibung:
EventType clr20r3, w3wp.exe P1, P2 6.0.3790.1830, P3-42435be1 app_web_7437ep-9 P4, P5 0.0.0.0, P6-433b1670 P7 9 P8, P9 system.exception, P10 NIL.

Ursache

Dieses Problem tritt auf, da die Standardrichtlinie für unbehandelte Ausnahmen in dem.NET Framework 2.0 und höheren Versionen geändert hat. Standardmäßig wird die Richtlinie für unbehandelte Ausnahmen den Workerprozess beendet.

In der Microsoft.NET Framework 1.1 und in der Microsoft.NET Framework 1.0 wurden unbehandelte Ausnahmen in verwalteten Threads ignoriert. Wenn Sie einen Debugger zum Abfangen der Ausnahme zugeordnet haben, würde Sie nicht erkennen, dass etwas nicht stimmt.

ASP.NET verwendet die Standardrichtlinie für unbehandelte Ausnahmen in dem.NET Framework 2.0 und höheren Versionen. Wenn eine nicht behandelte Ausnahme ausgelöst wird, wird die ASP.NET basierende Anwendung unerwartet beendet.

Dieses Verhalten gilt nicht für Ausnahmen, die im Kontext einer Anfrage auftreten. Diese Arten von Ausnahmen werden weiterhin verarbeitet und von HttpException -Objekt. Ausnahmen, die im Kontext einer Anfrage auftreten, verursachen keine Worker-Prozess zu beenden. Allerdings führen unbehandelte Ausnahmen außerhalb des Kontexts einer Anforderung, wie Ausnahmen in einem Thread Timer oder in eine Callback-Funktion den Arbeitsprozess beendet.

Lösung

Um dieses Problem zu beheben, verwenden Sie eine der folgenden Methoden.

Methode 1

Ändern Sie den Quellcode für das IHttpModule -Objekt, sodass es Ausnahmeinformationen im Anwendungsprotokoll protokolliert. Die protokollierten Informationen umfasst Folgendes:
  • Der Pfad des virtuellen Verzeichnisses in dem der Exceptionoccurred
  • Der Name des Ausnahmefehlers
  • Die Nachricht
  • Die Stapelüberwachung
Gehen Sie folgendermaßen vor, um das IHttpModule -Objekt zu ändern.

Hinweis Dieser Code protokolliert eine Meldung, die den Ereignistyp der Fehler und die Ereignisquelle von ASP.NET 2.0.50727.0 im Anwendungsprotokoll protokolliert hat. Um das Modul zu testen, fordern Sie eine ASP.NET Seite, die die ThreadPool.QueueUserWorkItem -Methode verwendet, um eine Methode aufzurufen, die eine nicht behandelte Ausnahme auslöst.
  1. Fügen Sie den folgenden Code in eine Datei, die namedUnhandledExceptionModule.cs ist.
    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. Speichern Sie die Datei "UnhandledExceptionModule.cs" in der Followingfolder:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Öffnen Sie die Microsoft Visual Studio 2005 starte.
  4. Typ Sn.exe-k key.snk, und Thenpress Sie die EINGABETASTE.
  5. Typ csc/t: library /r:system.web.dll,system.dll/keyfile:key.snk "UnhandledExceptionModule.cs", und klicken Sie dann PressENTER.
  6. Typ Gacutil.exe /ifUnhandledExceptionModule.dll, und drücken Sie dann die EINGABETASTE.
  7. Typ NGen-installUnhandledExceptionModule.dll, und drücken Sie dann die EINGABETASTE.
  8. Typ Gacutil /lUnhandledExceptionModule, und drücken Sie dann die EINGABETASTE, um die Thestrong für die Datei UnhandledExceptionModule anzuzeigen.
  9. (9) Den folgenden Code in die Datei "Web.config" yourASP.NET-Anwendung hinzufügen.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Methode 2

Ändern Sie die Richtlinie für unbehandelte Ausnahmen zurück zum Standardverhalten, das in.NET Framework 1.1 und in.NET Framework 1.0 auftritt.

Hinweis Ändern des Standardverhaltens wird nicht empfohlen. Wenn Sie Ausnahmen ignorieren, kann die Anwendung Ressourcenverluste und Sperren verzichten.

Um dieses Standardverhalten zu aktivieren, fügen Sie den folgenden Code hinzu Aspnet.config-Datei, die sich im folgenden Ordner befindet:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

Status

Dieses Verhalten ist beabsichtigt.

Weitere Informationen

Weitere Informationen zu Änderungen in.NET Framework 2.0 finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:
http://msdn2.Microsoft.com/en-us/netframework/aa570326.aspx

Eigenschaften

Artikel-ID: 911816 - Geändert am: Montag, 7. Oktober 2013 - Version: 2.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
Keywords: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell übersetzt und wird dann möglicherweise mithilfe des Community Translation Framework (CTF) von Mitgliedern unserer Microsoft Community nachbearbeitet. Weitere Informationen zu CTF finden Sie unter http://support.microsoft.com/gp/machine-translation-corrections/de.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 911816
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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