Neošetrené výnimky spôsobiť ASP.NET aplikácií sa neočakávane v platforme .NET Framework

Preklady článku Preklady článku
ID článku: 911816 - Zobraziť produkty, ktorých sa tento článok týka.
PoznámkaTento článok sa vzťahuje na Microsoft .NET Framework 2.0 a všetky novšie verzie.
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

Príznaky

Neošetrená výnimka je hádzať Microsoft ASP.NET-založené aplikácie, ktorá je postavená na platformu Microsoft .NET Framework 2.0 alebo novšia verzia, aplikácia nečakane. Ak sa vyskytne tento problém, žiadna výnimka informácie, ktoré musíte mať pochopenie problému je prihlásený v denníku aplikácie.

Avšak, hlásenie o udalosti, ktorá je podobná nasledovnej môže byť zaznamenaný v denníku systému:

Typ udalosti: Upozornenie
Zdroj udalosti: W3SVC
Kategória udalosti: žiadna
Identifikácia udalosti: 1009
Dátum: 9/28/2005
Čas: 3:18:11
PM užívateľ: n / a
Počítača: Servera IIS
Popis/kontrol:
Slúžiace fond aplikácií "DefaultAppPool" proces neočakávane skončil. Id procesu bol "2548". Výstupný kód procesu bol "0xe0434f4d".

Navyše, hlásenie o udalosti, ktorá je podobná nasledovnej môže byť prihlásený denníka aplikácie:

Typ udalosti: chyba
Zdroj udalosti: .NET Runtime 2.0 Error Reporting
Kategória udalosti: žiadna
Identifikácia udalosti: 5000
Dátum: 9/28/2005
Čas: 3:18:02 PM
Užívateľ: n / a
Počítača: Servera IIS
Popis/kontrol:
EventType 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, P9 system.exception, P10 nulová.

Príčina

Tento problém sa vyskytuje, pretože predvolená politika za nechránenú výnimky zmenil v .NET Framework 2.0 a novšie verzie. Štandardne politike za nechránenú výnimky sa ku koncu pracovného procesu.

V spoločnosti Microsoft.NET Framework 1.1 a platformu Microsoft .NET Framework 1.0, neošetrené výnimky na spravované vlákien boli ignorované. Pokiaľ ste priložené debugger chytiť výnimku, by nie uvedomíte, že niečo bolo zle.

Technológia ASP.net ju používa predvolená politika pre neošetrené výnimky v .NET Framework 2.0 a novšie verzie. Keď je hodená neošetrená výnimka, ASP.NET-založené aplikácia nečakane.

Toto správanie sa nevzťahuje na výnimky, ktoré sa vyskytujú v rámci žiadosti. Tieto druhy výnimiek sú ešte spracované a zabalené do objektu HttpException . Výnimky, ktoré sa vyskytujú v súvislosti s požiadavkou nespôsobujú pracovného procesu až do konca. Avšak, neošetrené výnimky mimo kontextu požiadavky, napríklad výnimiek na časovač vlákno alebo v callback funkciu, spôsobiť pracovného procesu až do konca.

Riešenie

Ak chcete vyriešiť tento problém, použite jednu z nasledujúcich metód.

Metóda 1

Upraviť zdrojový kód pre IHttpModule objekt tak, že to bude zaznamenávať informácie výnimky do denníka aplikácie. Informácie zapisované do denníka budú obsahovať:
  • Virtuálny adresár cestu, v ktorej exceptionoccurred
  • Názov výnimky z
  • Správa
  • Trasovanie zásobníka
Ak chcete upraviť objekt IHttpModule , postupujte nasledovne.

Poznámka Tento kód bude prihlásenie správu, ktorá obsahuje udalosť typu chyba a zdroj ASP.NET 2.0.50727.0 udalosť v denníku aplikácie. Test modulu, požiadať ASP.NET stránku, ktorá používa metódu ThreadPool.QueueUserWorkItem volať metódu ktorá hází nespracovanú výnimku.
  1. Vložte nasledujúci kód v súbore, ktorý 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. UnhandledExceptionModule.cs súbor uložte na followingfolder:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Otvorte program Microsoft Visual Studio 2005 CommandPrompt.
  4. Typ sn.exe -k key.snk, a stlačením tlačidla ENTER.
  5. Typ CSC /t:library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.cs, a potom pressENTER.
  6. Typ gacutil.exe /ifUnhandledExceptionModule.dll, a potom stlačte kláves ENTER.
  7. Typ NGEN installUnhandledExceptionModule.dll, a potom stlačte kláves ENTER.
  8. Typ /lUnhandledExceptionModule-gacutil, ktorý, a potom stlačte kláves ENTER na zobrazenie thestrong názov súboru UnhandledExceptionModule .
  9. 9. Pridajte nasledujúci kód v súbore Web.config yourASP.NET-založené aplikácie.
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Metóda 2

Nespracovaná výnimka politiky zmeniť späť na predvolené správanie, ktoré nastane v .NET Framework 1.1 a .NET Framework 1.0.

Poznámka Neodporúčame, že zmeniť predvolené správanie. Ak budete ignorovať výnimky, aplikácia môže unikať zdrojov a opustiť zámky.

Ak chcete povoliť toto predvolené správanie, pridajte nasledujúci kód do súboru Aspnet.config, ktorý sa nachádza v nasledovnom priečinku:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

Stav

Toto správanie je zámerné.

Ďalšie informácie

Ďalšie informácie o zmenách v .NET Framework 2.0, nájdete na nasledujúcej webovej lokalite webová lokalita Microsoft Developer Network (MSDN):
http://msdn2.Microsoft.com/en-US/NETFramework/aa570326.aspx

Vlastnosti

ID článku: 911816 - Posledná kontrola: 9. októbra 2013 - Revízia: 3.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
Kľúčové slová: 
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok je preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft a možno ho opraviť prostredníctvom technológie Community Translation Framework (CTF). Microsoft ponúka strojovo preložené články, články upravené komunitou aj články preložené prekladateľmi, aby zabezpečil prístup ku všetkým článkom databázy Knowledge Base vo viacerých jazykoch. Strojovo preložené články aj upravené články môžu obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky. Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené neprávnym prekladom obsahu alebo jeho použitím zo strany našich zákazníkov. Ďalšie informácie o technológii CTF nájdete na lokalite http://support.microsoft.com/gp/machine-translation-corrections/sk.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem: 911816

Odošlite odozvu

 

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