Freigeben über


Unbehandelte Ausnahmen verursachen ASP. NET-basierte Anwendungen, die unerwartet im .NET Framework beendet werden

Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem unbehandelte Ausnahmen ASP verursachen. NET-basierte Anwendungen, die unerwartet im .NET Framework beendet werden.

Originalproduktversion: .NET Framework 4.5
Ursprüngliche KB-Nummer: 911816

Notiz

Dieser Artikel bezieht sich auf Microsoft .NET Framework 2.0 und alle späteren Versionen.

Problembeschreibung

Wenn eine unbehandelte Ausnahme in einer ASP ausgelöst wird. NET-basierte Anwendung, die auf .NET Framework 2.0 und höheren Versionen basiert, wird die Anwendung unerwartet beendet. Wenn dieses Problem auftritt, müssen Sie keine Ausnahmeinformationen, die Sie zum Verständnis des Problems benötigen, im Anwendungsprotokoll protokolliert werden.

Eine Ereignismeldung, die dem folgenden Beispiel ähnelt, kann jedoch im Systemprotokoll protokolliert werden. Darüber hinaus kann eine Ereignismeldung, die dem folgenden Beispiel ähnelt, im Anwendungsprotokoll protokolliert werden.

Ursache

Dieses Problem tritt auf, da sich die Standardrichtlinie für nicht behandelte Ausnahmen in den Versionen .NET Framework 2.0 und höher geändert hat. Standardmäßig ist die Richtlinie für unbehandelte Ausnahmen das Beenden des Arbeitsprozesses.

In .NET Framework 1.1 und in .NET Framework 1.0 wurden nicht behandelte Ausnahmen für verwaltete Threads ignoriert. Sofern Sie keinen Debugger angefügt haben, um die Ausnahme zu erfassen, würden Sie nicht feststellen, dass etwas falsch war.

ASP.NET verwendet die Standardrichtlinie für unbehandelte Ausnahmen in .NET Framework 2.0 und höheren Versionen. Wenn eine unbehandelte Ausnahme ausgelöst wird, wird asp. Net-basierte Anwendung wird unerwartet beendet.

Dieses Verhalten gilt nicht für Ausnahmen, die im Kontext einer Anforderung auftreten. Diese Arten von Ausnahmen werden weiterhin von einem HttpException Objekt behandelt und umschlossen. 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, bewirken jedoch, 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 wurde in einer Variablen gespeichert.
  • Die Stapelablaufverfolgung

Führen Sie die folgenden Schritte aus, um das IHttpModule Objekt zu ändern.

Notiz

Dieser Code protokolliert eine Meldung mit dem Ereignistyp des Fehlers und der Ereignisquelle von 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.

  1. 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);
            }
        }
    }
    
  2. Speichern Sie die UnhandledExceptionModule.cs Datei im C:\Program Files\Microsoft Visual Studio 8\VC Ordner.

  3. Öffnen Sie die Visual Studio-Eingabeaufforderung.

  4. Geben Sie sn.exe -k key.snkein, und drücken Sie dann die EINGABETASTE.

  5. Geben Sie csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.csein, und drücken Sie dann die EINGABETASTE.

  6. Geben Sie gacutil.exe /if UnhandledExceptionModule.dllein, und drücken Sie dann die EINGABETASTE.

  7. Geben Sie ngen install UnhandledExceptionModule.dllein, und drücken Sie dann die EINGABETASTE.

  8. Geben Sie die EINGABETASTE ein, und drücken Sie gacutil /l UnhandledExceptionModuledann die EINGABETASTE, um den starken Namen für die Datei "UnhandledExceptionModule" anzuzeigen.

  9. Fügen Sie der Web.config-Datei Ihres ASP den folgenden Code hinzu. NET-basierte Anwendung.

    <add name="UnhandledExceptionModule"
    type="WebMonitor.UnhandledExceptionModule, <strong name>" />
    

Lösung 2

Ändern Sie die unbehandelte Ausnahmerichtlinie wieder in das Standardverhalten, das in .NET Framework 1.1 und in .NET Framework 1.0 auftritt.

Notiz

Es wird nicht empfohlen, das Standardverhalten zu ändern. Wenn Sie Ausnahmen ignorieren, kann die Anwendung Ressourcen verlecken und Sperren aufgeben.

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 in .NET Framework 2.0 finden Sie unter "Breaking Changes in .NET Framework 2.0".