Nicht behandelte Ausnahmen auslösen ASP.NET basierende Anwendung unerwartet in.NET Framework

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

Problembeschreibung

Wenn eine nicht behandelte Ausnahme in Microsoft ASP.NET basierende Anwendung, die auf Microsoft.NET Framework 2.0 oder höher ausgelöst wird, wird die Anwendung unerwartet beendet. Bei diesem Problem wird keine Sie das Problem verstehen müssen Ausnahmeinformationen im Anwendungsprotokoll protokolliert.

Aber möglicherweise eine Meldung, die der folgenden ähnelt im Systemprotokoll protokolliert: außerdem möglicherweise eine Meldung, die der folgenden ähnelt im Anwendungsprotokoll protokolliert:

Ursache

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

In Microsoft.NET Framework 1.1 und Microsoft.NET Framework 1.0 wurden nicht behandelte Ausnahmen in verwalteten Threads ignoriert. Wenn ein Debugger zum Abfangen der Ausnahme angefügt, würden Sie nicht erkennen, dass etwas falsch war.

ASP.NET verwendet die Standardrichtlinie für nicht behandelte Ausnahmen in.NET Framework 2.0 oder höher. Wenn eine Ausnahme ausgelöst wird, wird 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 behandelt und vom HttpException -Objekt. Ausnahmen, die im Kontext einer Anfrage auftreten, führen nicht Arbeitsprozess beendet. Allerdings führen nicht behandelte Ausnahmen außerhalb des Kontexts einer Anforderung, wie Ausnahmen in einem Timer Thread oder eine Rückruffunktion Arbeitsprozess beendet.

Problemlösung

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

Methode 1

Ändern Sie den Quellcode für das Objekt IHttpModule , sodass es Ausnahmeinformationen im Anwendungsprotokoll protokolliert. Die Informationen umfassen:
  • Der virtuelle Verzeichnispfad der Ausnahme
  • Der Ausnahmename
  • Die Nachricht
  • Stack-trace
Gehen Sie folgendermaßen vor, um das IHttpModule -Objekt zu ändern.

Hinweis Dieser Code protokolliert eine Meldung, die den Typ des Fehlers und die Ereignisquelle ASP.NET 2.0.50727.0 im Anwendungsprotokoll. Testen Sie das Modul fordern Sie eine ASP.NET Seite, mit der ThreadPool.QueueUserWorkItem -Methode zum Aufrufen einer Methode, die eine nicht behandelte Ausnahme auslöst.
  1. Fügen Sie folgenden Code in eine Datei mit dem Namen "UnhandledExceptionModule.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. Speichern Sie die Datei "UnhandledExceptionModule.cs" in folgendem Ordner:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Öffnen Sie Microsoft Visual Studio 2005 Command Prompt.
  4. Geben Sie sn.exe-k key.snk, und drücken Sie die EINGABETASTE.
  5. Geben Sie csc /t:library /r:system.web.dll,system.dll/keyfile: Key.snk "UnhandledExceptionModule.cs", und drücken Sie dann die EINGABETASTE.
  6. Geben Sie gacutil.exe/if UnhandledExceptionModule.dll ein, und drücken Sie dann die EINGABETASTE.
  7. Geben Sie Ngen install UnhandledExceptionModule.dll einund drücken Sie dann die EINGABETASTE.
  8. Geben Sie Gacutil/l UnhandledExceptionModule, und drücken Sie den starken Namen für die Datei UnhandledExceptionModule angezeigt.
  9. 9. Fügen Sie folgenden Code in die Datei Web.config Ihrer Anwendung ASP.NET basiert.
    <add name="UnhandledExceptionModule" type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Methode 2

Ändern Sie die Richtlinie nicht behandelte Ausnahme an das standardmäßige Verhalten in.NET Framework 1.1 und.NET Framework 1.0.

Hinweis Ändern des Standardverhaltens wird nicht empfohlen. Wenn Ausnahmen ignorieren, kann die Anwendung Ressourcenverluste und Verlassen sperren.

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

Status

Dieses Verhalten ist entwurfsbedingt.

Weitere Informationen

Weitere Informationen zu Änderungen in.NET Framework 2.0 finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:
Eigenschaften

Artikelnummer: 911816 – Letzte Überarbeitung: 16.01.2017 – Revision: 1

Microsoft .NET Framework 4.5, Microsoft .NET Framework 4.0, Microsoft .NET Framework 3.0, Microsoft .NET Framework 2.0

Feedback