net commandtimeout aumentar asp asp.net httpruntime executiontimeout

commandtimeout - ASP.Net httpruntimeecutionTimeout no funciona(y sí debug=false)



timeout asp net (3)

Me encontré con este artículo hace 2 días cuando tuve el mismo problema. Intenté todo, funcionó en mi máquina local pero no funcionó en el servidor de producción. Hoy, tengo una solución que soluciona el problema y me gustaría compartir. Microsoft parece no aplicar el tiempo de espera a IHttpAsyncHandler y aprovecho eso. En mi sistema, solo tengo 1 controlador que consume mucho tiempo, por lo que esta solución funciona para mí. Mi código de controlador se ve así:

public class Handler1 : IHttpAsyncHandler { public bool IsReusable { get { return true; } } public void ProcessRequest(HttpContext context) { } public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) { //My business logic is here AsynchOperation asynch = new AsynchOperation(cb, context, extraData); asynch.StartAsyncWork(); return asynch; } public void EndProcessRequest(IAsyncResult result) { } }

Y mi clase de ayudante:

class AsynchOperation : IAsyncResult { private bool _completed; private Object _state; private AsyncCallback _callback; private HttpContext _context; bool IAsyncResult.IsCompleted { get { return _completed; } } WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } } Object IAsyncResult.AsyncState { get { return _state; } } bool IAsyncResult.CompletedSynchronously { get { return false; } } public AsynchOperation(AsyncCallback callback, HttpContext context, Object state) { _callback = callback; _context = context; _state = state; _completed = false; } public void StartAsyncWork() { _completed = true; _callback(this); } }

En este enfoque, en realidad no hacemos nada de forma asíncrona. AsynchOperation es solo una tarea asin falsa. Toda la lógica de mi negocio todavía se ejecuta en el hilo principal que no cambia ningún comportamiento del código actual.

Recientemente hemos notado que la ejecución de TimeTimeout ha dejado de funcionar en nuestro sitio web. Definitivamente estaba funcionando ~ el año pasado ... es difícil de decir cuando se detuvo.

Actualmente estamos ejecutando en:

  • Windows-2008x64
  • IIS7
  • Binarios de 32 bits
  • Modo de tubería administrada = clásico
  • Versión de marco = v2.0

Web.Config tiene

<compilation defaultLanguage="vb" debug="false" batch="true"> <httpRuntime executionTimeout="90" />

Cualquier pista sobre por qué estamos viendo Timetaken todo el camino hasta ~ 20 minutos. ¿Las opciones de compilación para DebugType (full vs pdbonly) tendrían algún efecto?

datetime timetaken httpmethod Status Sent Received<BR> 12/19/10 0:10 901338 POST 302 456 24273<BR> 12/19/10 0:18 1817446 POST 302 0 114236<BR> 12/19/10 0:16 246923 POST 400 0 28512<BR> 12/19/10 0:12 220450 POST 302 0 65227<BR> 12/19/10 0:22 400150 GET 200 180835 416<BR> 12/19/10 0:20 335455 POST 400 0 36135<BR> 12/19/10 0:57 213210 POST 302 0 51558<BR> 12/19/10 0:48 352742 POST 302 438 25802<BR> 12/19/10 0:37 958660 POST 400 0 24558<BR> 12/19/10 0:06 202025 POST 302 0 58349<BR>


Tengo una teoría pero no estoy seguro de cómo probarlo. He hecho algo similar a y registrado la hora en que la solicitud comienza desde el controlador de eventos BeginRequest . Luego, cuando la solicitud se agota (1 hora más tarde en nuestro caso) se registra en la base de datos y se registra una marca de tiempo.

Así que aquí está la teoría: ASP.NET solo cuenta el tiempo que el subproceso se está ejecutando realmente, no el tiempo que está dormido.

Entonces, después de BeginRequest el hilo se pone en BeginRequest hasta que IIS recibe todo el cuerpo de la POST. Luego, el hilo se reactiva para que funcione y el reloj de executionTimeout inicia. Por lo tanto, el tiempo empleado en la fase de transmisión de la red no se cuenta en el tiempo de executionTimeout . Finalmente, se alcanza el Tiempo de espera de conexión en todo el sitio e IIS cierra la conexión, lo que genera una excepción en ASP.NET.

BeginRequest e incluso PreRequestHandlerExecute antes de que el cuerpo POST se transfiera al servidor web. Luego hay un largo intervalo antes de que se llame al manejador de solicitudes. Así que puede parecer que .NET tuvo la solicitud durante 30 minutos, pero el hilo no se ejecutó durante tanto tiempo.

Voy a comenzar a registrar el tiempo que el manejador de solicitudes realmente comienza a ejecutarse y a ver si alguna vez supera el límite que establecí.

Ahora, no tengo ni idea de cuánto tiempo puede permanecer una solicitud en la fase de transmisión de esta manera en cada URL. A nivel global, podemos establecer minBytesPerSecond en webLimits para la aplicación. No hay una interfaz de usuario para que pueda encontrar. Esto debería patear a los clientes ultra lentos en la fase de transmisión.

Eso todavía no soluciona el problema de los ataques DoS que realmente envían datos.


Tiempo de espera de ejecución y tiempo transcurrido dos cosas diferentes. Aunque, el tamaño de la discrepancia es preocupante.

el tiempo empleado incluye toda la hora de la red en la solicitud / respuesta (bajo ciertas conditions ). El tiempo de transferencia de la red supera fácilmente la cantidad de tiempo que tarda realmente una solicitud. Aunque, normalmente, estoy acostumbrado a solo segundos de diferencia, no minutos.

El tiempo de espera de ejecución se refiere solo a la cantidad de tiempo que el proceso del trabajador pasó procesando la solicitud; que es sólo un subconjunto de tiempo tomado. Solo se aplica si el atributo de depuración se establece en falso ; que parece que tienes.

Por supuesto, suponiendo que la primera solicitud que incluyó tomó los 90 segundos completos de tiempo de espera permitido, aún quedan 13,5 minutos restantes en la ventana de tiempo necesario para transferir esencialmente 24k de datos. Eso suena como un serio problema de red.

Por lo tanto, o bien tiene un problema de transporte grave o hay otro archivo web.config en algún lugar del árbol donde se procesan las solicitudes que establecen la depuración en verdadero o aumentan el tiempo de espera de ejecución a algo astronómico.

Otra posibilidad es que la página en sí tenga el conjunto de atributos de depuración o sus propios valores de tiempo de espera.