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を呼び出すのですか?
あなたは本当に例外を無視していますか?場合によってはキャッチしてログに記録するのはなぜですか?それがThreadAbortExceptionであることを確認してください –
ThreadAbortExceptionsはfinallyブロックをトリガーする必要があります。私たちがそこに到達しているかどうかを見るために例外をログに記録できると思いますが、finallyブロックは必ず実行する必要があります。 – NilObject