2012-05-22 13 views
6

He tratado de establecer el executionTimeout en el archivo web.config:Cómo configurar IHttpAsyncHandler un tiempo de espera?

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

En cuanto a la página de IIS Manager solicita que puedo ver las solicitudes no están siendo terminadas después de 30 segundos.
¿Debo implementar un temporizador dentro de mi IHttpAsyncHandler?

+0

En su lugar, le recomendaría averiguar por qué su código se está ejecutando más tiempo del que le gustaría, y tener controles periódicos dentro de él para detener la ejecución y devolver lo que tiene hasta ahora, si es posible. –

+0

@ andrew-barber Estoy usando IHttpAsyncHandler para la agrupación larga (con el fin de enviar una notificación al cliente). Se supone que tiene largos tiempos de ejecución, pero aún así me gustaría tener un tiempo de espera. – Adir

Respuesta

4

Con la aparente falta de compatibilidad integrada para tiempos de espera IHttpAsyncHandler, presumiblemente debe gestionar su propio tiempo de espera. Quizás esto es por diseño; después de todo, está eligiendo un patrón asíncrono: ¿a quién cree MSFT que está intentando establecer un tiempo de espera predeterminado para su tarea de larga ejecución?

Lo que yo haría es usar ThreadPool.RegisterWaitForSingleObject para administrar su sondeo con un tiempo de espera adecuado. Aquí está un ejemplo de código que utilizo para evitar la espera en un servicio web que nunca regresa:

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(); 
      } 
     } 

, es necesario un IAsyncResult para trabajar con este enfoque, pero eso es un patrón establecido que no debería tener problemas para correr por las muestras sobre .

Además, se encontrará con problemas cuando IIS decida reciclar su grupo de aplicaciones/derribar el dominio de su aplicación mientras su encuesta aún se está ejecutando. Si esa es una condición que desea manejar, puede usar HostingEnvironment.RegisterObject.

0

Usted puede tratar de añadir esto a su archivo web.config:

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

Su para PageAsyncTask, pero apenas puede ser distinguido por IHttpAsyncHandler también?

Si no es así, es posible que tenga más suerte con el nuevo HttpTaskAsyncHandler en ASP.Net 4.5 Versión: http://www.asp.net/vnext/overview/whitepapers/whats-new#_Toc318097378

+0

Parece que no tiene ningún efecto en el controlador – Adir

Cuestiones relacionadas