はい.NET Framework 2.0で未処理の異常によりASPに基づく.NETのアプリケーションが意外に終了しました(コメントを追加しました) 9627 ワード フレームワーク 参照本明细书中适用的产品 function loadTOCNode(){} 文書番号: 911816 最終変更: 2006年11月3日リビジョン: 1.0 このページ症状 の原因となる ソリューション 方法1 方法2 ≪ステータス|Status|emdw≫ 詳細 var sectionFilter = "type != 'notice' && type != 'securedata' && type != 'querywords'";var tocArrow = "/library/images/support/kbgraphics/public/en-us/downarrow.gif";var depthLimit = 10;var depth3Limit = 10;var depth4Limit = 5;var depth5Limit = 3;var tocEntryMinimum = 1; 症状 loadTOCNode(1, 'symptoms'); 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(1, 'cause'); この問題の原因は、例外を処理していないデフォルトポリシーがあることにある.NET Framework 2.0で変更されました.デフォルトでは、例外を処理しないポリシーは、作業プロセスを終了します.MicrosoftでNET Framework 1.1とMicrosoft.NET Framework 1.0では、管理スレッド上の未処理例外は無視されます.例外をキャプチャするためにデバッガを追加しない限り、エラーに気づかない可能性があります.ASP.NETはいます.NET Framework 2.0では、例外が処理されていないデフォルトポリシーが使用されます.未処理の異常が発生する場合、ASPに基づく.NETのアプリケーションは予期せぬ終了となります.リクエストコンテキストで例外が発生した場合、上記の動作は発生しません.このような異常は依然としてHttpExceptionオブジェクトは処理と包装を行います.リクエストコンテキストに発生する例外は、ワークプロセスの終了にはなりません.ただし、リクエストコンテキスト以外の未処理の例外(タイマスレッドやコールバック関数の例外など)は、ワークフローを終了させます.回到顶端 解决方案 loadTOCNode(1, 'resolution'); この問題を解決するには、次のいずれかの方法を使用します.回到顶端 方法 1 loadTOCNode(2, 'resolution');変更IHttpModuleオブジェクトのソースコードを使用して、アプリケーション・ログに例外情報を記録します.記録された情報には、次の内容が含まれます.• 例外が発生した仮想ディレクトリパス• 例外名• メッセージ• スタックトラッキング変更するIHttpModuleオブジェクトは、次の手順に従います.注:このコードには、イベント・タイプが「エラー」であり、イベント・ソースが「ASP.NET 2.0.50727.0」のメッセージがアプリケーション・ログに記録されます.モジュールをテストするには、使用を要求できます.ThreadPool.QueUserWorkItemメソッドのASP.NETページでは、未処理の例外を引き起こすメソッドを呼び出します.1. 次のコードを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); } } } 2. これを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を押します.//強いタイプDLLにコンパイル6. gacutilと入力します.exe/if UnhandledExceptionModule.dll、Enterを押します.//バッファにプログラムセットを追加7. を入力します.dll、Enterを押します.//インストーラセットのようです8. gacutil/l UnhandledExceptionModuleと入力し、Enterを押してUnhandledExceptionModuleファイルの強い名前を表示します.//グローバル・プログラム・セットUnhandledExceptionModuleファイルの強い名前を表示9. 9.次のコードをASPベースに追加する.NETのアプリのWeb.configファイルにあります.//は、8ステップ目に表示されるコンテンツであり、httpModulesセクション <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> 回到顶端 状态 loadTOCNode(1, 'status'); この現象は設計が使然としている.回到顶端 更多信息 loadTOCNode(1, 'moreinformation'); 関連するNET Framework 2.0での変更の詳細については、次のMicrosoft Developer Network(MSDN)Webサイトを参照してください.http://msdn2.microsoft.com/zh-cn/netframework/aa570326.aspx (http://msdn2.microsoft.com/zh-cn/netframework/aa570326.aspx) 回到顶端 [BOJ]1062-教诲 BFSとDFS