Způsobit neošetřené výjimky neočekávaně v rozhraní.NET Framework aplikace založená na technologii ASP.NET

Překlady článku Překlady článku
ID článku: 911816 - Produkty, které se vztahují k tomuto článku.
Poznámka:Tento článek se týká aplikace Microsoft rozhraní.NET Framework 2.0 a všechny vyšší verze.
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řená výjimka v Microsoft aplikace založená na technologii ASP.NET, který je založen na Microsoft rozhraní.NET Framework 2.0 nebo novější, aplikace se neočekávaně ukončí. Když nastane tento problém, žádné informace o výjimce, která je nutné k pochopení problému je zaznamenána v protokolu aplikace.

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

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
PM uživatele: N/A
Počítač: Služba IIS SERVER
Popis:
Proces obsluhující fond aplikací "DefaultAppPool" byl neočekávaně ukončen. Identifikátor procesu je "2548". Kód ukončení procesu je "0xe0434f4d".

Zprávu o události, která je podobná následující může být zaznamenána v protokolu aplikace:

Typ události: Chyba
Zdroj události: .NET Runtime 2.0 zasílání zpráv o chybách
Kategorie události: žádné
ID události: 5000
Datum: 9/28/2005
Čas: 3:18:02 PM
Uživatel: N/A
Počítač: Služba IIS SERVER
Popis:
Typ události clr20r3 P1 w3wp.exe, P2 6.0.3790.1830 P3 42435be1 P4 app_web_7437ep-9, P5 0.0.0.0 P6 433b1670, P7 9, P8 system.exception, P9, P10 NIL.

Příčina

K tomuto problému dochází, protože došlo ke změně výchozí zásady pro neošetřené výjimky v rozhraní.NET Framework 2.0 a novější verze. Výchozí zásady pro neošetřené výjimky je ukončení pracovního procesu.

V Microsoft rozhraní.NET Framework 1.1 a Microsoft rozhraní.NET Framework 1.0 neošetřené výjimky na spravovaná vlákna byly ignorovány. Pokud je připojen ladicí program k zachycení výjimky, by si uvědomit, že cokoliv bylo nesprávné.

Technologie ASP.NET použije výchozí zásady pro neošetřené výjimky v rozhraní.NET Framework 2.0 a novější verze. Když je vyvolána neošetřená výjimka, založená na technologii ASP.NET aplikace se neočekávaně ukončí.

Toto chování se nevztahuje na výjimky, které se vyskytují v kontextu požadavku. Tyto druhy výjimek jsou stále zpracovávány a zabalené HttpException objekt. Výjimky, které se vyskytují v kontextu požadavku nezpůsobí ukončení pracovního procesu. Neošetřené výjimky mimo kontext požadavku, jako jsou výjimky v podprocesu časovače nebo funkci zpětného volání však způsobit ukončení pracovního procesu.

Řešení

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

Metoda 1

Upravte zdrojový kód IHttpModule objekt tak, že zapíše informace o výjimce do protokolu aplikací. Informace, které je obsahují následující:
  • Cestu virtuálního adresáře, ve kterém exceptionoccurred
  • Název výjimky
  • Zpráva
  • Trasování zásobníku
IHttpModule objekt upravit, postupujte takto.

Poznámka: Tento kód zapíše zprávu, která má událost typu Chyba a technologie ASP.NET 2.0.50727.0 zdroj události v protokolu aplikace. Testování modulu, požadavku na stránku ASP.NET používající metodu ThreadPool.QueueUserWorkItem volat metodu, která je vyvolána neošetřená výjimka.
  1. Vložte následující kód do souboru, který je namedUnhandledExceptionModule.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 soubor UnhandledExceptionModule.cs followingfolder:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Otevřete aplikaci Microsoft Visual Studio 2005 CommandPrompt.
  4. Zadejte příkaz key.snk Sn.exe -ka thenpress ENTER.
  5. Zadejte příkaz CSC /t:library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.csa pak pressENTER.
  6. Zadejte příkaz Gacutil.exe /ifUnhandledExceptionModule.dll, a stiskněte klávesu ENTER.
  7. Zadejte příkaz Ngen installUnhandledExceptionModule.dll, a stiskněte klávesu ENTER.
  8. Zadejte příkaz Gacutil /lUnhandledExceptionModule, a stiskněte klávesu ENTER, chcete-li zobrazit název souboru UnhandledExceptionModule thestrong.
  9. 9. Přidejte následující kód do souboru Web.config aplikace založené na yourASP.NET.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Metoda 2

Změňte výchozí chování, ke kterým dochází v rozhraní.NET Framework 1.0 a 1.1 rozhraní.NET Framework zásad neošetřená výjimka.

Poznámka: Nedoporučujeme výchozí chování změnit. Pokud budete ignorovat výjimky, aplikace může způsobit únik prostředků a opustit zámky.

Chcete-li toto výchozí chování, přidejte následující kód do souboru 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í

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

Další informace

Další informace o změnách rozhraní.NET Framework 2.0 naleznete na následujícím webu Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx

Vlastnosti

ID článku: 911816 - Poslední aktualizace: 10. října 2013 - Revize: 4.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • 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 je přeložen pomocí softwaru na strojový překlad Microsoft. Nepřesný či chybný překlad lze opravit prostřednictvím technologie Community Translation Framework (CTF). Microsoft nabízí strojově přeložené, komunitou dodatečně upravované články, a články přeložené lidmi s cílem zajistit přístup ke všem článkům v naší znalostní bázi ve více jazycích. Strojově přeložené a dodatečně upravované články mohou obsahovat chyby ve slovníku, syntaxi a gramatice. Společnost Microsoft není odpovědná za jakékoliv nepřesnosti, chyby nebo škody způsobené nesprávným překladem obsahu nebo jeho použitím našimi zákazníky. Více o CTF naleznete na http://support.microsoft.com/gp/machine-translation-corrections/cs.
Projděte si také anglickou verzi článku: 911816

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com