我試圖設置executionTimeout在Web.config文件中:如何設置IHttpAsyncHandler超時?
<compilation debug="false" targetFramework="4.5">
<httpRuntime executionTimeout="30"/>
望着IIS管理器請求頁面可以看我的請求沒有在30秒後結束。
我應該在我的IHttpAsyncHandler中實現一個Timer嗎?
我試圖設置executionTimeout在Web.config文件中:如何設置IHttpAsyncHandler超時?
<compilation debug="false" targetFramework="4.5">
<httpRuntime executionTimeout="30"/>
望着IIS管理器請求頁面可以看我的請求沒有在30秒後結束。
我應該在我的IHttpAsyncHandler中實現一個Timer嗎?
的鏈接有了明顯缺乏對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。
你可以嘗試添加到您的web.config
文件:
<system.web>
<pages asyncTimeout="30" />
</system.web>
其爲PageAsyncTask
,只是可能會被表彰IHttpAsyncHandler
呢?
如果沒有,你可能有更多的運氣與新HttpTaskAsyncHandler
在ASP.Net
4.5版本: http://www.asp.net/vnext/overview/whitepapers/whats-new#_Toc318097378
似乎對處理程序沒有影響 – Adir
你將不得不使用RegisterAsyncTask檢查下面
'PageAsyncTask'不能用於'IHttpHandler'和'IHttpAsyncHandler' –
我會推薦你想想爲什麼你的代碼運行的時間比你想要的要長,並且定期檢查它,以便停止執行並返回到目前爲止,如果可能的話。 –
@ andrew-barber我正在使用IHttpAsyncHandler進行長時間共享(爲了向客戶端發送通知)。它應該有很長的運行時間,但我仍然想要暫停。 – Adir