はい.NET Framework 2.0で未処理の異常によりASPに基づく.NETのアプリケーションが予期せぬ終了


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.
 
 
解決策:
 

方法1


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ファイルにあります.
    <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>