Delen via


Niet-verwerkte uitzonderingen veroorzaken ASP. Op NET gebaseerde toepassingen die onverwacht moeten worden afgesloten in .NET Framework

Dit artikel helpt u bij het oplossen van het probleem waarbij niet-verwerkte uitzonderingen ASP veroorzaken. Op NET gebaseerde toepassingen die onverwacht moeten worden afgesloten in .NET Framework.

Oorspronkelijke productversie: .NET Framework 4.5
Oorspronkelijk KB-nummer: 911816

Notitie

Dit artikel is van toepassing op Microsoft .NET Framework 2.0 en alle latere versies.

Symptomen

Wanneer een onverwerkte uitzondering wordt gegenereerd in een ASP. Op NET gebaseerde toepassing die is gebouwd op .NET Framework 2.0 en nieuwere versies, wordt de toepassing onverwacht afgesloten. Wanneer dit probleem zich voordoet, hoeft u geen uitzonderingsinformatie te weten te komen over het probleem dat in het toepassingslogboek wordt geregistreerd.

Een gebeurtenisbericht dat lijkt op het volgende voorbeeld, kan echter worden vastgelegd in het systeemlogboek. Daarnaast kan een gebeurtenisbericht dat vergelijkbaar is met het volgende voorbeeld, worden vastgelegd in het toepassingslogboek.

Oorzaak

Dit probleem treedt op omdat het standaardbeleid voor niet-verwerkte uitzonderingen is gewijzigd in .NET Framework 2.0 en latere versies. Het beleid voor niet-verwerkte uitzonderingen is standaard om het werkproces te beëindigen.

In .NET Framework 1.1 en in .NET Framework 1.0 zijn niet-verwerkte uitzonderingen op beheerde threads genegeerd. Tenzij u een foutopsporingsprogramma hebt gekoppeld om de uitzondering te ondervangen, zou u zich niet realiseren dat er iets mis was.

ASP.NET gebruikt het standaardbeleid voor niet-verwerkte uitzonderingen in .NET Framework 2.0 en latere versies. Wanneer er een onverwerkte uitzondering wordt gegenereerd, wordt de ASP gebruikt. De toepassing op basis van NET wordt onverwacht afgesloten.

Dit gedrag is niet van toepassing op uitzonderingen die optreden in de context van een aanvraag. Dit soort uitzonderingen worden nog steeds verwerkt en verpakt door een HttpException object. Uitzonderingen die optreden in de context van een aanvraag, zorgen er niet voor dat het werkproces wordt beëindigd. Niet-verwerkte uitzonderingen buiten de context van een aanvraag, zoals uitzonderingen op een timerthread of in een callback-functie, zorgen er echter voor dat het werkproces wordt beëindigd.

Oplossing 1

Wijzig de broncode voor het IHttpModule object zodat uitzonderingsgegevens worden vastgelegd in het toepassingslogboek. De informatie die wordt geregistreerd, bevat het volgende:

  • Het pad naar de virtuele map waarin de uitzondering is opgetreden
  • De uitzonderingsnaam
  • Het bericht
  • De stacktracering

Volg deze stappen om het IHttpModule object te wijzigen.

Notitie

Met deze code wordt een bericht vastgelegd met het gebeurtenistype fout en de gebeurtenisbron van ASP.NET 2.0.50727.0 in het toepassingslogboek. Als u de module wilt testen, vraagt u een ASP.NET-pagina aan die gebruikmaakt van de ThreadPool.QueueUserWorkItem methode om een methode aan te roepen waarmee een onverwerkte uitzondering wordt gegenereerd.

  1. Plaats de volgende code in een bestand met de naam 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. Sla het UnhandledExceptionModule.cs bestand op in de C:\Program Files\Microsoft Visual Studio 8\VC map.

  3. Open de Opdrachtprompt van Visual Studio.

  4. Typ sn.exe -k key.snken druk op Enter.

  5. Typ csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.csen druk op Enter.

  6. Typ gacutil.exe /if UnhandledExceptionModule.dllen druk op Enter.

  7. Typ ngen install UnhandledExceptionModule.dllen druk op Enter.

  8. Typ gacutil /l UnhandledExceptionModuleen druk op Enter om de sterke naam voor het bestand UnhandledExceptionModule weer te geven.

  9. Voeg de volgende code toe aan het Web.config-bestand van uw ASP. Toepassing op basis van NET.

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

Oplossing 2

Wijzig het niet-verwerkte uitzonderingsbeleid terug naar het standaardgedrag dat optreedt in .NET Framework 1.1 en in .NET Framework 1.0.

Notitie

We raden u niet aan het standaardgedrag te wijzigen. Als u uitzonderingen negeert, kan de toepassing resources lekken en vergrendelingen afbreken.

Als u dit standaardgedrag wilt inschakelen, voegt u de volgende code toe aan het Aspnet.config-bestand dat zich in de volgende map bevindt:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727

<configuration>
     <runtime>
         <legacyUnhandledExceptionPolicy enabled="true" />
     </runtime>
</configuration>

Status

Dit is zo ontworpen.

Meer informatie

Ga naar Belangrijke wijzigingen in .NET Framework 2.0 voor meer informatie over wijzigingen in .NET Framework 2.0.