未處理的例外狀況會導致意外地結束在.NET Framework 中的 ASP.NET 架構應用程式

文章翻譯 文章翻譯
文章編號: 911816 - 檢視此文章適用的產品。
附註本文適用於 Microsoft.NET Framework 2.0 和所有更新的版本。
全部展開 | 全部摺疊

在此頁中

徵狀

在 Microsoft 基礎 Microsoft.NET Framework 2.0 或更新版本的 ASP.NET 架構應用程式擲回未處理的例外狀況時,應用程式意外結束。發生這個問題時,您必須了解這個問題沒有例外狀況資訊會記錄在應用程式記錄檔。

不過,系統記錄檔可能會記錄類似下列的事件訊息:

事件類型: 警告
事件來源: W3SVC
事件類別:無
事件識別碼: 1009年
2005/9/28 日期:
時間: 3:18:11
下午使用者: n/A
IIS 伺服器電腦:
描述:
伺服應用程式集區 'DefaultAppPool' 的處理序意外終止。處理程序識別碼為 '2548'。處理序結束碼是 '0xe0434f4d'。

此外,類似下列的事件訊息可能會記錄在應用程式記錄檔中:

事件類型: 錯誤
事件來源:.NET 執行階段 2.0 錯誤報告
事件類別:無
事件識別碼: 5000
2005/9/28 日期:
時間: 下午 3:18:02
使用者:n/A
IIS 伺服器電腦:
描述:
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 章第 8 頁,以 a、 9 頁所述的 system.exception,P10 倍零墩。

發生的原因

因為未處理例外狀況的預設原則已變更在.NET Framework 2.0 和更新版本,就會發生這個問題。根據預設,未處理例外狀況原則會結束背景工作處理序。

在 Microsoft.NET Framework 1.1 和 Microsoft.NET Framework 1.0 中,已忽略受管理的執行緒上的未處理例外狀況。除非您附加偵錯工具攔截的例外狀況時,您將無法測知任何項目時錯誤。

ASP.NET 會使用預設原則,在.NET Framework 2.0 和更新版本的未處理例外狀況。擲回未處理的例外狀況時,ASP.NET 應用程式意外結束。

此行為不適用於要求的內容中發生的例外狀況。這些種類的例外狀況仍然處理和包裝HttpException物件。在要求內容中發生的例外狀況並不會結束背景工作處理序。不過,外部內容未處理例外狀況的要求,例如計時器執行緒或回呼函式的例外狀況會造成背景工作處理序結束。

解決方案

若要解決這個問題,請使用下列方法之一:

方法 1

修改IHttpModule物件的原始程式碼,使它將應用程式記錄檔記錄例外狀況資訊。記錄的資訊將包括下列:
  • 中的虛擬目錄路徑 exceptionoccurred
  • 例外狀況名稱
  • 訊息
  • 堆疊追蹤
若要修改的IHttpModule物件,請依照下列步驟執行。

附註這段程式碼將會記錄在應用程式記錄檔中有錯誤的事件類型以及事件的來源ASP.NET 2.0.50727.0的訊息。若要測試模組,要求的 ASP.NET 網頁,使用ThreadPool.QueueUserWorkItem方法來呼叫擲回未處理的例外狀況的方法。
  1. 下列程式碼置於 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 檔案儲存到 followingfolder:
    C:\Program 必要 Visual Studio 的 8\VC
  3. 開啟 Microsoft Visual Studio 2005 CommandPrompt。
  4. 型別 sn.exe-k key.snk並 thenpress ENTER。
  5. 型別 csc /t:library UnhandledExceptionModule.cs /r:system.web.dll,system.dll/keyfile:key.snk然後再 pressENTER。
  6. 型別 gacutil.exe /ifUnhandledExceptionModule.dll然後按 ENTER 鍵。
  7. 型別 ngen installUnhandledExceptionModule.dll然後按 ENTER 鍵。
  8. 型別 gacutil /lUnhandledExceptionModule然後按下 ENTER 以顯示 thestrong 的UnhandledExceptionModule檔案的名稱。
  9. 9.將下列程式碼加入 yourASP.NET 為基礎的應用程式的 Web.config 檔。
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

方法 2

將處理的例外狀況原則變更回預設行為,.NET Framework 1.0 和.NET Framework 1.1 版中,就會發生。

附註我們不建議您變更預設行為。如果您選擇忽略的例外狀況,應用程式可能會遺漏資源及放棄鎖定。

若要啟用這項預設行為,請先位於下列資料夾中的 Aspnet.config 檔案中加入下列程式碼:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

狀況說明

這種行為是經過設計規劃。

其他相關資訊

如需有關在.NET Framework 2.0 中的變更的詳細資訊,請至下列的 Microsoft 開發人員網路 (MSDN) 網站:
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx

屬性

文章編號: 911816 - 上次校閱: 2013年10月7日 - 版次: 2.0
這篇文章中的資訊適用於:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
關鍵字:?
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtzh
機器翻譯
請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。
按一下這裡查看此文章的英文版本:911816
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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