Tiempo de espera de solicitud de IIS en una operación de ASP.NET larga

87

Estoy experimentando un tiempo de espera de solicitud de IIS cuando ejecuto una operación larga. Detrás de escena, mi aplicación ASP.NET está procesando datos, pero la cantidad de registros que se están procesando es grande y, por lo tanto, la operación está tardando mucho tiempo.

Sin embargo, creo que IIS agota la sesión. ¿Es esto un problema con la sesión de IIS o ASP.NET?

Gracias por adelantado

Tachi
fuente

Respuestas:

146

Si desea extender la cantidad de tiempo permitido para que se ejecute un script ASP.NET, aumente el Server.ScriptTimeoutvalor. El valor predeterminado es 90 segundos para .NET 1.xy 110 segundos para .NET 2.0 y posteriores.

Por ejemplo:

// Increase script timeout for current page to five minutes
Server.ScriptTimeout = 300;

Este valor también se puede configurar en su web.configarchivo en el httpRuntimeelemento de configuración:

<!-- Increase script timeout to five minutes -->
<httpRuntime executionTimeout="300" 
  ... other configuration attributes ...
/>

ingrese la descripción de la imagen aquí

Tenga en cuenta de acuerdo con la documentación de MSDN :

"Este tiempo de espera se aplica solo si el atributo de depuración en el elemento de compilación es Falso. Por lo tanto, si el atributo de depuración es Verdadero, no es necesario que establezca este atributo en un valor grande para evitar el cierre de la aplicación mientras realiza la depuración. "

Si ya ha hecho esto, pero descubre que su sesión está caducando, aumente el HttpSessionState.Timeoutvalor de ASP.NET :

Por ejemplo:

// Increase session timeout to thirty minutes
Session.Timeout = 30;

Este valor también se puede configurar en su web.configarchivo en el sessionStateelemento de configuración:

<configuration>
  <system.web>
    <sessionState 
      mode="InProc"
      cookieless="true"
      timeout="30" />
  </system.web>
</configuration>

Si su secuencia de comandos tarda varios minutos en ejecutarse y hay muchos usuarios simultáneos, considere cambiar la página a una página asincrónica . Esto aumentará la escalabilidad de su aplicación.

La otra alternativa, si tiene acceso de administrador al servidor, es considerar esta operación de larga duración como un candidato para implementar como una tarea programada o un servicio de Windows.

Kev
fuente
FYI httpRuntime executionTimeout está en segundos y no tiene T mayúscula
Andrew Rimmer
7
También es importante tener en cuenta que el modo de depuración se establece en falso para que se utilice este valor de tiempo de espera: <system.web> <compilation debug = "false" targetFramework = "4.0" /> </ system.web>
Jesse Roper
@JesseRoper, si puede indicarme los documentos al respecto, me complacerá incluirlo en la respuesta, o puede editar mi respuesta directamente. Ejército de reserva.
Kev
El valor de executionTimeout predeterminado es 110 segundos.
frattaro
20

¡Excelente y exhaustiva respuesta de @Kev!

Como hice un procesamiento largo solo en una página de administración en una aplicación WebForms, usé la opción de código. Pero para permitir una solución rápida temporal en la producción, utilicé la versión de configuración en un<location> etiqueta en web.config. De esta manera, mi página de administración / procesamiento obtuvo suficiente tiempo, mientras que las páginas para usuarios finales y demás mantuvieron su antiguo comportamiento de tiempo de espera.

A continuación, les di la configuración para los empleados de Google que necesitan la misma solución rápida. Debe utilizar otros valores por supuesto que mi ejemplo '4 horas', pero DO nota de que la sesión timeOutes en cuestión de minutos, mientras que la solicitudexecutionTimeout es en cuestión de segundos!

Y, dado que ya es 2015, para una NO-corrección rápida, debe usar async / await de .Net 4.5 ahora si es posible, en lugar de la página ASYNC de .NET 2.0 que era de vanguardia cuando KEV respondió en 2010 :).

<configuration>
    ... 
    <compilation debug="false" ...>
    ... other stuff ..

    <location path="~/Admin/SomePage.aspx">
        <system.web>
            <sessionState timeout="240" />
            <httpRuntime executionTimeout="14400" />
        </system.web>
    </location>
    ...
</configuration>
Bart
fuente
He incluido el fragmento de "ubicación" en mi web.config pero no funciona. Estoy usando sólo "executionTimeout", no necesito "sessionState". ¿Tengo que configurar algo más? Estoy usando NET 4.0. Si utilizo "httpRuntime" directamente en "system.web", aplica el tiempo de espera correctamente en todas las páginas.
Oliver
11

Estoy publicando esto aquí, porque pasé como 3 y 4 horas en él, y solo encontré respuestas como las de arriba, que dicen agregar el executionTime, pero no resuelve el problema en el caso de que está utilizando ASP .NET Core . Para ello, esto funcionaría:

En el archivo web.config, agregue el requestTimeoutatributo en el aspNetCorenodo.

<system.webServer>
  <aspNetCore requestTimeout="00:10:00" ... (other configs goes here) />
</system.webServer>

En este ejemplo, establezco el valor en 10 minutos.

Referencia: https://docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module#configuring-the-asp-net-core-module

Edmundo Rodrigues
fuente
Esto se aplica solo para el OutOfProcessmodelo de alojamiento. Porque InProcessno hay configuración de tiempo de espera. IIS seguirá esperando a que se complete el proceso, consulte
Rosdi Kasim
-9

Quite el ~carácter en la ubicación para

path="~/Admin/SomePage.aspx"

se convierte en

path="Admin/SomePage.aspx"
sadu
fuente
No responde la pregunta
Igor