24

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
}
4

2 に答える 2

4

それは私に一度起こりました。(私の場合)本当のエラーは、プールをシャットダウンしていたスタックオーバーフローでした。

IIS がリソースを過剰に消費しないように保護していたようです。

DebugDiag を使用して問題を発見しました。

これが私が始めた場所です:http://www.webdebug.ne​​t/index.php/2012/12/collect-iis-crash-dump-with-debugdiag/

外部 DLL の例外が原因で IIS アプリケーション プールがシャットダウンする理由を理解したいと思います。例外が DLL 内でキャッチされている場合でも、ASP.NET ページのコード ビハインド内から DLL のメソッドを呼び出す場合でも同様です。 .

外部 dll もアプリケーション プールで実行されます。この dll で重大なクラッシュが発生すると、アプリケーション プールもクラッシュします。一部の例外は処理できず、stackoverflow 例外はその 1 つです。件名はここで議論されています。多分それはあなたの場合に起こることです。

于 2013-04-16T18:47:29.967 に答える