Nicht behandelte Ausnahmen verursachen ASP. NET-basierte Anwendungen werden unerwartet im .NET Framework

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

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

Hinweis

Dieser Artikel gilt für microsoft .NET Framework 2.0 und alle höheren Versionen.

Symptome

Wenn in einer ASP eine Ausnahme ausgelöst wird, die nicht behandelt wird. Net-basierte Anwendung, die auf dem .NET Framework 2.0 und höheren Versionen basiert, wird die Anwendung unerwartet beendet. Wenn dieses Problem auftritt, werden keine Ausnahmeinformationen, die Sie benötigen, um das Problem zu verstehen, im Anwendungsprotokoll protokolliert.

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, weil sich die Standardrichtlinie für nicht behandelte Ausnahmen in .NET Framework 2.0 und höheren Versionen 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 nicht behandelte Ausnahmen für verwaltete Threads ignoriert. Wenn Sie keinen Debugger angefügt haben, um die Ausnahme abzufangen, würden Sie nicht feststellen, dass etwas falsch war.

ASP.NET verwendet die Standardrichtlinie für nicht behandelte Ausnahmen in .NET Framework 2.0 und höheren Versionen. Wenn eine nicht behandelte Ausnahme ausgelöst wird, wird asp. DIE 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. Nicht behandelte Ausnahmen außerhalb des Kontexts einer Anforderung, z. B. Ausnahmen in einem Timerthread 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, sodass Ausnahmeinformationen im Anwendungsprotokoll protokolliert werden. Die protokollierten Informationen umfassen Folgendes:

  • Der pfad des virtuellen Verzeichnisses, in dem die Ausnahme aufgetreten ist
  • Der Ausnahmename
  • Die Nachricht
  • Die Stapelüberwachung

Führen Sie die folgenden Schritte aus, um das IHttpModule -Objekt zu ä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 nicht behandelte 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 ein sn.exe -k key.snk, und drücken Sie dann die EINGABETASTE.

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

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

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

  8. Geben Sie ein gacutil /l UnhandledExceptionModule, und drücken Sie dann die EINGABETASTE, um den starken Namen für die UnhandledExceptionModule-Datei 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 Ausnahmerichtlinie für unbehandelte Ausnahmen wieder auf 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 kompromittiert und Sperren verwerfen.

Um dieses Standardverhalten zu aktivieren, fügen Sie den folgenden Code zur Aspnet.config-Datei hinzu, die sich im folgenden Ordner befindet:
%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.