Nicht behandelte Ausnahmen führen dazu, dass ASP.NET-basierte Anwendungen unerwartet in der .NET Framework
Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem nicht behandelte Ausnahmen dazu führen, dass ASP.NET-basierte Anwendungen unerwartet im .NET Framework beendet werden.
Ursprüngliche Produktversion: .NET Framework 4.5
Ursprüngliche KB-Nummer: 911816
Hinweis
Dieser Artikel bezieht sich auf microsoft .NET Framework 2.0 und alle neueren Versionen.
Problembeschreibung
Wenn eine unbehandelte Ausnahme in einer ASP.NET-basierten Anwendung ausgelöst wird, die auf der .NET Framework 2.0 und höher basiert, wird die Anwendung unerwartet beendet. Wenn dieses Problem auftritt, werden keine Ausnahmeinformationen, die Sie zum Verständnis des Problems benötigen, im Anwendungsprotokoll protokolliert.
Eine Ereignismeldung, die dem folgenden Beispiel ähnelt, kann jedoch im Systemprotokoll protokolliert werden. Darüber hinaus kann eine Ereignisnachricht, die dem folgenden Beispiel ähnelt, im Anwendungsprotokoll protokolliert werden.
Ursache
Dieses Problem tritt auf, weil sich die Standardrichtlinie für nicht behandelte Ausnahmen in der .NET Framework 2.0 und höher geändert hat. Standardmäßig besteht die Richtlinie für unbehandelte Ausnahmen darin, den Arbeitsprozess zu beenden.
Im .NET Framework 1.1 und im .NET Framework 1.0 wurden unbehandelte Ausnahmen für verwaltete Threads ignoriert. Wenn Sie keinen Debugger angefügt haben, um die Ausnahme abzufangen, würden Sie nicht erkennen, dass etwas falsch war.
ASP.NET verwendet die Standardrichtlinie für nicht behandelte Ausnahmen in der .NET Framework 2.0 und höher. Wenn eine unbehandelte Ausnahme ausgelöst wird, wird die ASP.NET-basierte Anwendung unerwartet beendet.
Dieses Verhalten gilt nicht für Ausnahmen, die im Kontext einer Anforderung auftreten. Diese Arten von Ausnahmen werden weiterhin von einem Objekt behandelt und HttpException umbrochen. Ausnahmen, die im Kontext einer Anforderung auftreten, führen nicht dazu, dass der Arbeitsprozess beendet wird. Unbehandelte Ausnahmen außerhalb des Kontexts einer Anforderung, z. B. Ausnahmen in einem Zeitgeberthread oder in einer Rückruffunktion, führen jedoch dazu, dass der Arbeitsprozess beendet wird.
Lösung 1
Ändern Sie den Quellcode für das IHttpModule Objekt so, dass Ausnahmeinformationen im Anwendungsprotokoll protokolliert werden. Die protokollierten Informationen umfassen Folgendes:
- Der virtuelle Verzeichnispfad, in dem die Ausnahme aufgetreten ist
- Der Ausnahmename
- Die Nachricht
- Die Stapelüberwachung
Führen Sie die folgenden Schritte aus, um das Objekt zu IHttpModule ändern.
Hinweis
Dieser Code protokolliert eine Meldung mit dem Ereignistyp "Fehler" und der Ereignisquelle ASP.NET 2.0.50727.0 im Anwendungsprotokoll. Um das Modul zu testen, fordern Sie eine ASP.NET Seite an, die die ThreadPool.QueueUserWorkItem Methode verwendet, um eine Methode aufzurufen, die eine unbehandelte Ausnahme auslöst.
Fügen Sie den folgenden Code in eine Datei mit dem Namen "UnhandledExceptionModule.cs" ein.
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); } } }Speichern Sie die Datei "UnhandledExceptionModule.cs" im
C:\Program Files\Microsoft Visual Studio 8\VCOrdner.Öffnen Sie die Eingabeaufforderung Visual Studio.
Geben Sie
sn.exe -k key.snkein, und drücken Sie dann die EINGABETASTE.Geben Sie
csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.csein, und drücken Sie dann die EINGABETASTE.Geben Sie
gacutil.exe /if UnhandledExceptionModule.dllein, und drücken Sie dann die EINGABETASTE.Geben Sie
ngen install UnhandledExceptionModule.dllein, und drücken Sie dann die EINGABETASTE.Geben Sie
gacutil /l UnhandledExceptionModuleein, und drücken Sie die EINGABETASTE, um den starken Namen für die Datei "UnhandledExceptionModule" anzuzeigen.Fügen Sie der Web.config-Datei Ihrer ASP.NET-basierten Anwendung den folgenden Code hinzu.
<add name="UnhandledExceptionModule" type="WebMonitor.UnhandledExceptionModule, <strong name>" />
Lösung 2
Ändern Sie die unbehandelte Ausnahmerichtlinie wieder in das Standardverhalten, das im .NET Framework 1.1 und im .NET Framework 1.0 auftritt.
Hinweis
Es wird nicht empfohlen, das Standardverhalten zu ändern. Wenn Sie Ausnahmen ignorieren, kann die Anwendung Ressourcen offengelegt und Sperren abbrechen.
Um dieses Standardverhalten zu aktivieren, fügen Sie der Aspnet.config Datei, die sich im folgenden Ordner befindet, den folgenden Code hinzu:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
<runtime>
<legacyUnhandledExceptionPolicy enabled="true" />
</runtime>
</configuration>
Status
Es handelt sich hierbei um ein beabsichtigtes Verhalten.
Weitere Informationen
Weitere Informationen zu Änderungen im .NET Framework 2.0 finden Sie unter Breaking Changes in .NET Framework 2.0.