우리는 IIS 6에서 ASP.NET 3.5의 비동기 HttpHandler를 사용하고 있습니다. 코드가 너무 많이로드되지 않으면 외부 API 호출을 수행하려고합니다. 우리는 "너무 많은로드"를 정의했습니다. 이는 X 이상의 요청이이 API를 동시에 사용하는 경우 API 호출을 건너 뛰는 것입니다.비동기 HttpHandler의 요청이 예외없이 중단 될 수 있습니까?
이 작업을 수행하기 위해 코드를 세마포 및 Try/Catch/Finally로 래핑했습니다. 세마포어를 해제하지 않고이 코드를 실행할 수있는 방법이없는 것처럼 느껴지지만 일부 추가 로깅을 사용하면 릴리스 문이 호출되지 않는 무거운로드가 있음을 알 수 있습니다.
코드는 이것이다 : 우리는 시간을 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가 예외없이 인터럽트 요청을 가질 수있는 방법이 있습니까?
예외를 정말로 무시하고 있습니까? 혹시라도 잡으려고하고 로그인하지 않으시겠습니까? 그것을 ThreadAbortException이라고 두드리기 –
ThreadAbortExceptions는 여전히 finally 블록을 트리거해야합니다. 나는 우리가 거기에 도착하는 것을보기 위해 예외를 로그 할 수 있다고 생각하지만 finally 블록은 항상 실행되어야합니다. – NilObject