Neošetřené výjimky způsobit ASP.Aplikace založené na NET neočekávaně ukončit v.NET Framework 2.0

ID článku: 911816 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Když je vyvolána neošetřenou výjimku Microsoft PROSTŘEDÍ ASP.Aplikace založená na NET, který je založený na Microsoft.Rozhraní .NET Framework 2.0, aplikace neočekávaně ukončena. Když nastane tento problém, žádná výjimka informace, které jsou nutné pro pochopení problému je zaznamenána Protokol aplikací.

Zprávu o události, je však podobná v protokolu systému může být zaznamenána následující:

Typ události: Upozornění
Zdroj události: W3SVC
Kategorie události: žádný
ID události: 1009
Datum: 9/28/2005
Čas: 3: 18: 11
Uživatel PM: N/A
Počítač: IIS SERVER
Popis:
Proces fondu aplikací sloužící "defaultapppool" byla neočekávaně ukončena. Id procesu byla "2548". Na kód ukončení procesu byla "0xe0434f4d".

Navíc zpráva události je podobný následujícímu může být zaznamenána v protokolu aplikací:

Typ události: Chyba
Zdroj události:.NET Runtime 2.0 Hlášení chyb
Kategorie události: žádný
ID události: 5000
Datum: 28/9/2005
Čas: 3:18:02 PM
Uživatel: není k dispozici
Počítač: Služba IIS SERVER
Popis:
Typ události clr20r3 P1 w3wp.exe, P2 6.0.3790.1830, P3 42435be1, app_web_7437ep P4-9, P5 0.0.0.0, P6 433b1670, P7 9, P8, P9 položky System.Exception P10 NIL.

Příčina

K tomuto problému dochází, protože výchozí zásady pro neošetřené výjimky se změnil v.Rozhraní .NET Framework 2.0. Ve výchozím nastavení zásad pro neošetřené výjimky je ukončení pracovního procesu.

Microsoft .Rozhraní .NET Framework 1.1 a Microsoft.NET Framework 1.0, neošetřené výjimky spravované podprocesů byly ignorovány. Pokud je připojen ladicí program pro zachytit výjimku, by nebyl zjistíte vše, co bylo chybný.

PROSTŘEDÍ ASP.NET použije výchozí zásady pro neošetřené výjimky v .Rozhraní .NET Framework 2.0. Když je vyvolána neošetřená výjimka, ASP.Založené na NET aplikace neočekávaně ukončena.

Toto chování se nevztahuje na výjimky, které se vyskytují v kontextu požadavku. Tyto druhy výjimky stále zpracována a zabalena podle HttpException objekt. Výjimky, které se vyskytují v kontextu požadavku nejsou způsobit ukončení pracovního procesu. Však neošetřené výjimky mimo kontextu požadavku, jako jsou například výjimky v podprocesu časovače nebo ve zpětném volání funkce, pracovní proces ukončen.

Řešení

Chcete-li tento problém vyřešit, použijte jednu z následujících metod.

Metoda 1

Upravit zdrojový kód IHttpModule objekt tak, aby se zaznamená informace o výjimce k Protokol aplikací. Informace, které je zaznamenána bude následující:
  • Cestu virtuálního adresáře, ve kterém výjimka došlo k
  • Název výjimky
  • Zpráva
  • Trasování zásobníku
Změnit IHttpModule objekt, postupujte následujícím způsobem.

Poznámka: Tento kód bude protokolovat zprávy typu události Chyba a zdroj události PROSTŘEDÍ ASP.NET 2.0.50727.0 v protokolu aplikací. Chcete-li otestovat modulu, požádat o ASP.NET stránka, která používá ThreadPool.QueueUserWorkItem Metoda volat metodu, která neošetřenou výjimku.
  1. Vložte následující kód do souboru s názvem 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. Uložte následující soubor UnhandledExceptionModule.cs Složka:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Spusťte příkaz Microsoft Visual Studio 2005 Dotaz.
  4. Typ key.snk sn.exe -ka pak stiskněte klávesu ENTER.
  5. Typ CSC /t:library /r:system.web.dll,system.dll /KeyFile:Key.snk UnhandledExceptionModule.csa pak stiskněte klávesu. ZADEJTE.
  6. Typ Gacutil.exe /if UnhandledExceptionModule.dll, a pak stiskněte klávesu ENTER.
  7. Typ instalace Ngen UnhandledExceptionModule.dll, a pak stiskněte klávesu ENTER.
  8. Typ Gacutil /l UnhandledExceptionModule, a potom stisknutím klávesy ENTER zobrazte Silný název UnhandledExceptionModule soubor.
  9. 9. Přidejte následující kód do souboru Web.config aplikace PROSTŘEDÍ ASP.Aplikace založená na NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Metoda 2

Změna zásad neošetřené výjimce zpět na výchozí chování Tato situace nastane v.Rozhraní .NET Framework 1.1 a v.Rozhraní .NET Framework 1.0.

Poznámka: Nedoporučujeme používat výchozí chování změnit. Pokud jste Ignorovat výjimky, aplikace pravděpodobně únik prostředků a opuštění zámky.

Chcete-li toto výchozí chování povolit, přidejte následující kód na Soubor ASPNET.config, který je umístěn v následující složce:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

Prohlášení

To chování je záměrné.

Další informace

Další informace o změnách.NET Framework 2.0, navštivte následující Web společnosti Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx

Vlastnosti

ID článku: 911816 - Poslední aktualizace: 22. května 2011 - Revize: 3.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft .NET Framework 2.0
Klíčová slova: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:911816

Dejte nám zpětnou vazbu