2009-04-24 9 views
2

ASP.NET 3.5ではIIS 6で非同期HttpHandlerを使用しています。私たちのコードでは、あまり負荷がかからない場合に外部API呼び出しを実行したいと考えています。 「あまりにも多くの負荷」を定義しました。これは、このAPIを同時に使用するX個以上のリクエストがある場合、APIの呼び出しをスキップするだけです。非同期HttpHandlerの要求を例外なく中断できますか?

これを達成するために、コードをセマフォとラップ/試合/最後にラップしました。私はセマフォを解放せずにこのコードを実行する方法がないように感じるが、追加のログを追加すると、負荷がかかっているときにreleaseステートメントが呼び出されないことがわかっている。

コードはこれです:私たちは時間をHttpWebRequestのアウトしたときの例外を見てきました

static Semaphore requestLimiter = new Semaphore(500, 500); 

... 

String GetResultFromAPI() { 
    if (!requestLimiter.WaitOne(0)) return null; 

    try 
    { 
     // ... code to perform API call, with a timeout specified on the HttpWebRequest 
     return result; 
    } catch { /* ignore exceptions */ } 
    finally 
    { 
     requestLimiter.Release(); 
    } 
    return null; 
} 

ので、私たちは、このコードはrequestLimiterセマフォが0に降りるにつながる可能性がどのようにと困惑していますそして決して回復しない。

誰かがこれに遭遇しましたか?非同期のHttpHandlerが例外なく中断された要求を持つことができる方法はありますか?

編集

どうやらThreadAbortExceptionsは、このコードは間違いで失敗することが厄介な獣です。私たちはThread.Abortを明示的に呼び出すのではなく、HttpWebRequestもそうは思わない。しかし、今回の修正された質問は、ASP.NETは非同期HTTP要求のためにThread.Abortを呼び出すのですか?

+0

あなたは本当に例外を無視していますか?場合によってはキャッチしてログに記録するのはなぜですか?それがThreadAbortExceptionであることを確認してください –

+0

ThreadAbortExceptionsはfinallyブロックをトリガーする必要があります。私たちがそこに到達しているかどうかを見るために例外をログに記録できると思いますが、finallyブロックは必ず実行する必要があります。 – NilObject

答えて

2

IISはThreadAbortExceptionをトリガーするワーカースレッドをシャットダウンでき、ThreadAbortExceptionは必ずしも最後に捕捉されるわけではありません。彼らはキャッチでキャッチされます。 IISが何らかの理由でWebリクエストを強制終了すると、この問題が発生しました。私のロギングプロセスは新しいスレッドで生成され、エラーを記録し、Thread.Abortは私のロギングプロセスを終了させます。最終的に{}のログにログオンスレッドを投入しようとしても、IISはそれを強制終了します。私はそれを解決する方法を決して決めることができませんでした。

とにかく、イベントビューアでリサイクル/強制終了ワーカースレッドをチェックして、アプリケーションプールを確認し、頻繁にリサイクル/再起動しないように設定していることを確認します。

+0

私はこれが起こっていると信じています。セマフォを放棄して、何らかのアトミック/アッテネーションを行い、カウンタをリセットして、中断された要求をすべて考慮に入れるようにしました。このソリューションは非常にうまく動作します。 – NilObject

2

セマフォを取得してtry catchブロックに入るまでの間にthreadabort例外が発生する可能性があります。

編集

それはあなたのfinallyブロックをバイパスすることになるスローされるバンドの例外のうちのためにも可能です。 Constrained Execution Regions hereについて詳しく読むことができます。

+0

例外が表示されないため、セマフォの動作の原因とはなりません。しかし、指摘されています。 – NilObject

関連する問題