2012-05-22 171 views
6

我試圖設置executionTimeout在Web.config文件中:如何設置IHttpAsyncHandler超時?

<compilation debug="false" targetFramework="4.5"> 
<httpRuntime executionTimeout="30"/> 

望着IIS管理器請求頁面可以看我的請求沒有在30秒後結束。
我應該在我的IHttpAsyncHandler中實現一個Timer嗎?

+0

我會推薦你​​想想爲什麼你的代碼運行的時間比你想要的要長,並且定期檢查它,以便停止執行並返回到目前爲止,如果可能的話。 –

+0

@ andrew-barber我正在使用IHttpAsyncHandler進行長時間共享(爲了向客戶端發送通知)。它應該有很長的運行時間,但我仍然想要暫停。 – Adir

回答

4

的鏈接有了明顯缺乏對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

0

你可以嘗試添加到您的web.config文件:

<system.web> 
    <pages asyncTimeout="30" /> 
</system.web> 

其爲PageAsyncTask,只是可能會被表彰IHttpAsyncHandler呢?

如果沒有,你可能有更多的運氣與新HttpTaskAsyncHandlerASP.Net 4.5版本: http://www.asp.net/vnext/overview/whitepapers/whats-new#_Toc318097378

+0

似乎對處理程序沒有影響 – Adir