web.config ファイルで executionTimeout を設定しようとしました。
<compilation debug="false" targetFramework="4.5">
<httpRuntime executionTimeout="30"/>
IIS Manager Requests ページを見ると、30 秒経っても要求が終了していないことがわかります。
IHttpAsyncHandler 内にタイマーを実装する必要がありますか?
web.config ファイルで executionTimeout を設定しようとしました。
<compilation debug="false" targetFramework="4.5">
<httpRuntime executionTimeout="30"/>
IIS Manager Requests ページを見ると、30 秒経っても要求が終了していないことがわかります。
IHttpAsyncHandler 内にタイマーを実装する必要がありますか?
IHttpAsyncHandler タイムアウトの組み込みサポートが明らかに不足しているため、おそらく独自のタイムアウトを管理する必要があります。おそらくこれは仕様によるものです。結局、あなたは非同期パターンを選択しています - MSFT は誰があなたの長時間実行タスクの既定のタイムアウトを設定しようとしていると思いますか?
私がすることは、ThreadPool.RegisterWaitForSingleObjectを使用して、適切なタイムアウトでポーリングを管理することです。以下は、返されない Web サービスを待機しないようにするために使用するコード サンプルです。
private const int REQUEST_TIMEOUT = 30000; // miliseconds (30 sec)
private void CallService()
{
try {
string url = "somewebservice.com";
WebRequest request = WebRequest.Create(url);
// Asynchronously fire off the request
IAsyncResult result = request.BeginGetResponse(new AsyncCallback(MyRoutineThatUsesTheResults), request);
// Handle timed-out requests
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(RequestTimeout), request, REQUEST_TIMEOUT, true);
}
catch (Exception ex) {
_logger.Error("Error during web service request.", ex);
}
private void RequestTimeout(object state, bool timedOut)
{
if (timedOut) {
WebRequest request = (WebRequest)state;
_logger.WarnFormat("Request to {0} timed out (> {1} sec)", request.RequestUri.ToString(), REQUEST_TIMEOUT / 1000);
request.Abort();
}
}
このアプローチを使用するには IAsyncResult が必要ですが、これは確立されたパターンであり、サンプルの実行に問題はありません。
また、ポーリングがまだ実行されている間に、IIS がアプリ プールのリサイクルやアプリ ドメインの破棄を決定すると、問題が発生します。それが処理したい条件である場合は、HostingEnvironment.RegisterObjectを使用できます。
RegisterAsyncTask を使用する必要があります。以下のリンクを確認してください。