はい.NET Framework 2.0で未処理の異常によりASPに基づく.NETのアプリケーションが予期せぬ終了
6045 ワード
MicrosoftでNET Framework 2.0で構築されたMicrosoftベースASP.NETのアプリケーションで未処理の例外が発生し、そのアプリケーションは予期せぬ終了となります.この問題が発生した場合、この問題を理解するために必要な例外情報はアプリケーション・ログに記録されません.
ただし、システム・ログには、次のようなイベント・メッセージが記録される場合があります.
イベントタイプ:警告イベントソース:W 3 SVCイベントカテゴリ:イベントIDなし:1009日付:9/28/2005時間:3:18:11 PMユーザー:N/Aコンピュータ:IIS-SERVER説明:アプリケーションプール「DefaultAppPool」にサービスを提供するプロセスが予期せぬ終了しました.プロセスIDは「2548」です.プロセス終了コードは「0 xe 0434 f 4 d」です.また、アプリケーション・ログには、次のようなイベント・メッセージが記録される場合があります.
イベントタイプ:エラーイベントソース:.NET Runtime 2.0エラーレポートイベント種別:イベントIDなし:5000日付:9/28/2005時間:3:18:02 PMユーザ:N/Aコンピュータ:IIS-SERVER記述:EventType clr 20 r 3,P 1 w 3 wp.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.
解決策:
loadTOCNode(2, 'resolution');
IHttpModuleオブジェクトのソースコードを変更して、アプリケーション・ログに例外情報を記録します.記録された情報には、次の内容が含まれます.異常が発生した仮想ディレクトリパス 異常名称 メッセージ スタックトラッキング IHttpModuleオブジェクトを変更するには、次の手順に従います.注:このコードには、イベント・タイプが「エラー」であり、イベント・ソースが「ASP.NET 2.0.50727.0」のメッセージがアプリケーション・ログに記録されます.モジュールをテストするには、ThreadPoolの使用を要求することができます.QueUserWorkItemメソッドのASP.NETページでは、未処理の例外を引き起こすメソッドを呼び出します.次のコードを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\rUnhandledException logged by UnhandledExceptionModule.dll:\r\rappId="); 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\rtype={0}\r\rmessage={1}\r\rstack=\r{2}\r\r", currentException.GetType().FullName, currentException.Message, currentException.StackTrace); } EventLog Log = new EventLog(); Log.Source = _sourceName; Log.WriteEntry(message.ToString(), EventLogEntryType.Error); } }}
U n h a n dledExceptionModule.csファイルは次のフォルダに保存されます.
C:\Program Files\Microsoft Visual Studio 8\VC
Microsoft Visual Studio 2005コマンドプロンプトウィンドウを開きます. snと入力.exe -k key.snk、Enterを押します. csc/t:library/r:systemと入力します.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.cs、Enterを押します. gacutilと入力します.exe/if UnhandledExceptionModule.dll、Enterを押します. ngen install UnhandledExceptionModuleと入力します.dll、Enterを押します. gacutil/l UnhandledExceptionModuleと入力し、Enterを押してUnhandledExceptionModuleファイルの強い名前を表示します.
9.次のコードをASPベースに追加する.NETのアプリのWeb.configファイルにあります.
loadTOCNode(2, 'resolution');
未処理の例外ポリシーを戻します.NET Framework 1.1と.NET Framework 1.0で発生するデフォルトの動作.
注:デフォルトの動作を変更することはお勧めしません.例外を無視すると、アプリケーションがリソースを漏洩し、ロックを放棄する可能性があります.
このデフォルトの動作を有効にするには、次のフォルダにあるAspnetに次のコードを追加します.configファイル:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
ただし、システム・ログには、次のようなイベント・メッセージが記録される場合があります.
イベントタイプ:警告イベントソース:W 3 SVCイベントカテゴリ:イベントIDなし:1009日付:9/28/2005時間:3:18:11 PMユーザー:N/Aコンピュータ:IIS-SERVER説明:アプリケーションプール「DefaultAppPool」にサービスを提供するプロセスが予期せぬ終了しました.プロセスIDは「2548」です.プロセス終了コードは「0 xe 0434 f 4 d」です.また、アプリケーション・ログには、次のようなイベント・メッセージが記録される場合があります.
イベントタイプ:エラーイベントソース:.NET Runtime 2.0エラーレポートイベント種別:イベントIDなし:5000日付:9/28/2005時間:3:18:02 PMユーザ:N/Aコンピュータ:IIS-SERVER記述:EventType clr 20 r 3,P 1 w 3 wp.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.
解決策:
方法1
loadTOCNode(2, 'resolution');
IHttpModuleオブジェクトのソースコードを変更して、アプリケーション・ログに例外情報を記録します.記録された情報には、次の内容が含まれます.
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\rUnhandledException logged by UnhandledExceptionModule.dll:\r\rappId="); 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\rtype={0}\r\rmessage={1}\r\rstack=\r{2}\r\r", currentException.GetType().FullName, currentException.Message, currentException.StackTrace); } EventLog Log = new EventLog(); Log.Source = _sourceName; Log.WriteEntry(message.ToString(), EventLogEntryType.Error); } }}
C:\Program Files\Microsoft Visual Studio 8\VC
9.次のコードをASPベースに追加する.NETのアプリのWeb.configファイルにあります.
<add name="UnhandledExceptionModule"
type="WebMonitor.UnhandledExceptionModule, <strong name>" />
方法2
loadTOCNode(2, 'resolution');
未処理の例外ポリシーを戻します.NET Framework 1.1と.NET Framework 1.0で発生するデフォルトの動作.
注:デフォルトの動作を変更することはお勧めしません.例外を無視すると、アプリケーションがリソースを漏洩し、ロックを放棄する可能性があります.
このデフォルトの動作を有効にするには、次のフォルダにあるAspnetに次のコードを追加します.configファイル:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
<runtime>
<legacyUnhandledExceptionPolicy enabled="true" />
</runtime>
</configuration>