Как установить IHttpAsyncHandler тайм-аут?
Я попытался установить executeTimeout в файле web.config:
<compilation debug="false" targetFramework="4.5">
<httpRuntime executionTimeout="30"/>
Глядя на страницу "Запросы диспетчера IIS", я вижу, что запросы не завершаются через 30 секунд.
Должен ли я реализовать таймер внутри моего IHttpAsyncHandler?
3 ответа
С очевидным отсутствием встроенной поддержки тайм-аутов IHttpAsyncHandler, вероятно, вы должны управлять своим собственным тайм-аутом. Возможно, это по замыслу; В конце концов, вы выбираете асинхронный шаблон - кто, по мнению MSFT, пытается установить время ожидания по умолчанию для вашей долгосрочной задачи?
То, что я хотел бы сделать, это использовать ThreadPool.RegisterWaitForSingleObject, чтобы управлять опросом с соответствующим таймаутом. Вот пример кода, который я использую, чтобы избежать ожидания на веб-сервисе, который никогда не возвращается:
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, проверьте ссылку ниже
Вы можете попробовать добавить это к вашему 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