ASP.NET アプリケーション プールのシャットダウンの問題とIIS 7.5:アプリケーション プールの問題の投稿を読みましたが、私の質問には答えませんでした。
コード ビハインドで BIN ディレクトリ経由で提供される DLL からクラスをインスタンス化し、このインスタンスでメソッドを呼び出す C# ASP.NET ページがあります。System.ArgumentException
オブジェクト内に存在しない列が原因で、DLL 内のメソッドがスローされDataRow
ます。イベント ログに次のエラーが表示されます。
Source: ASP.NET 2.0.50727.0
Application ID: /LM/W3SVC/1/ROOT/...
Process ID: 9476
Exception: System.ArgumentException
Message: Column 'someColumn' does not belong to table.
StrackTrace:
ASP.NET ページの呼び出しコードは、メソッド呼び出しを汎用try-catch
ブロックでラップします。ページを要求すると、IIS インスタンスの対応するアプリケーション プールがクラッシュし、Web サイトが利用できなくなります (エラー 503)。アプリケーション プールを手動で再起動する必要があり、サイトは再び機能します。
要求に応じてtry catch
、ASP.NET コード ビハインドからのブロックを更新します。
try
{
SomeExternalClass someExternalClass = new SomeExternalClass();
someExternalClass.SomeMethod( someId );
}
catch( Exception ex )
{
// "smp" is an instance of "StatusMessagePanel", a control we use on all pages
// to show error information, basically a div container with an icon.
smp.ShowError( ex.Message );
}
ここで私の質問は、System.ArgumentException
存在しない列にアクセスしようとしたときにスローされるなどの比較的「単純な」例外がDataRow
、Web サイト全体をクラッシュさせるのはなぜですか? ASP.NET ページの一般的なtry-catch
ブロックも役に立ちません。また、これが Web サイト全体を完全に使用不可にする理由になるべきではありませんか、それとも間違った仮定ですか? これが基本的に(II)サーバーをダウンさせる可能性があるとは思いもしませんでした。
アクセスする前に列の存在を確認する必要があると人々が私に言うことを見越して: 私はそれについて知っており、レガシーコードは現在変更されていますが、これは上記の私の質問ではありません.理由を知りたいです.結果は非常に劇的です。
更新 2
try-catch
問題のメソッドが DLL 内で呼び出され、ブロックにラップされたスレッドが開始されます。
[...]
try
{
ThreadStart starter = () => CreateReport(...)
Thread thread = new Thread( starter );
thread.Start();
if( !thread.Join( TimeSpan.FromMinutes( 15 ) ) )
{
// Log some timeout warning
}
else
{
// Log information about successful report generation
}
}
catch( Exception ex )
{
// Log error information
}