現在オフラインです。再接続するためにインターネットの接続を待っています

.NET Framework 2.0 で、ハンドルされない例外によって ASP.NET ベースのアプリケーションが突然終了する

現象
Microsoft .NET Framework 2.0 に基づいて構築された Microsoft ASP.NET ベースのアプリケーションで、ハンドルされない例外がスローされると、そのアプリケーションが突然終了します。この問題が発生したとき、問題の理解に必要な例外情報がアプリケーション ログに記録されません。

ただし、次のようなイベント メッセージがシステム ログに記録されることがあります。

イベントの種類: 警告
ソース: W3SVC
分類: なし
イベント ID: 1009
日付: 2005/09/28
時刻: 03:18:11
PM ユーザー: N/A
コンピューター: IIS-SERVER
説明:
アプリケーション プール 'DefaultAppPool' で提供しているプロセスが突然終了しました。プロセス id は '2548' でした。プロセス終了コードは '0xe0434f4d' でした。

さらに、次のようなイベント メッセージがアプリケーション ログに記録されることがあります。

イベントの種類: エラー
ソース: .NET Runtime 2.0 Error Reporting
分類: なし
イベント ID: 5000
日付: 2005/09/28
時刻: 15:18:02
ユーザー: N/A
コンピューター: IIS-SERVER
説明:
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 a, P9 system.exception, P10 NIL.

原因
この問題は、ハンドルされない例外に対する既定のポリシーが .NET Framework 2.0 で変更されたことが原因で発生します。.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 オブジェクトのソース コードを変更します。ログ出力に含める情報を次に示します。
  • 例外が発生した仮想ディレクトリのパス
  • 例外の名前
  • メッセージ
  • スタック トレース
IHttpModule オブジェクトを変更するには、次の手順を実行します。

注: このコードでは、イベントの種類が "エラー"、イベント ソースが "ASP.NET 2.0.50727.0" のメッセージをアプリケーション ログに記録します。モジュールをテストするには、ThreadPool.QueueUserWorkItem メソッドを使用する ASP.NET ページを要求して、ハンドルされない例外をスローするメソッドを呼び出します。
  1. 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) {// 各 AppDomain に対して 1 回実行する。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) {// 各 AppDomain に対して 1 回実行されるようにする。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 ファイルを次のフォルダーに保存します。
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Microsoft Visual Studio 2005 コマンド プロンプトを開きます。
  4. sn.exe -k key.snk」と入力し、Enter キーを押します。
  5. csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.cs」と入力し、Enter キーを押します。
  6. gacutil.exe /if UnhandledExceptionModule.dll」と入力し、Enter キーを押します。
  7. ngen install UnhandledExceptionModule.dll」と入力し、Enter キーを押します。
  8. gacutil /l UnhandledExceptionModule」と入力してから Enter キーを押し、UnhandledExceptionModule ファイルの厳密な名前を表示します。
  9. 9. ASP.NET ベースのアプリケーションの Web.config ファイルに次のコードを追加します。
    <add name="UnhandledExceptionModule" 	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

方法 2

ハンドルされない例外のポリシーを、.NET Framework 1.1 と .NET Framework 1.0 で実行される既定の動作に戻します。

: 既定の動作は変更しないことをお勧めします。例外を無視した場合、アプリケーションでリソース リークが発生することやロックが破棄されることがあります。

この既定の動作を有効にするには、次のフォルダーにある Aspnet.config ファイルに、以下のコードを追加します。
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration><runtime><legacyUnhandledExceptionPolicy enabled="true" /></runtime></configuration>
状況
この動作は仕様です。
詳細
.NET Framework 2.0 での変更点の詳細については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。
crash
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:911816 - 最終更新日: 07/02/2013 14:06:00 - リビジョン: 1.0

Microsoft .NET Framework 2.0

  • kbtshoot kbfix kbprogramming kbprb KB911816
フィードバック