asp.net iis iis-7 iis-7.5 castle-monorail

Cómo establecer diferentes tiempos de espera para diferentes URL en ASP.NET



iis iis-7 (3)

La pregunta formulada específicamente sobre los tiempos de espera, pero también implica la configuración de maxRequestLength también. Voy a intentar dar una respuesta muy completa a ambos problemas (ahora que he pasado la mayor parte del día trabajando en ello).

Digamos que tenemos una única URL en nuestro sitio web que deseamos procesar los archivos subidos. Queremos admitir hasta un Gigabyte de datos en esa URL y permitiremos que los clientes se conecten durante, como máximo, 1 hora. Todas las demás URL queremos permitir solo 90 segundos de tiempo de conexión y un máximo de 4 MB en el cuerpo de la POST.

Ajustes globales

Primero, debe aumentar globalmente los límites de tiempo y tamaño para todo el sitio. Primero desea configurar el "Tiempo de espera de conexión" para todo el sitio. Esto actúa como un límite superior absoluto y no se puede establecer desde web.config. El sitio web de IIS7 tiene buenas instrucciones aquí . También puede hacerlo mediante programación con la library Microsoft.Web.Administration que se envió con IIS7 / 7.5:

var serverManager = ServerManager.OpenRemote("//web-server-name"); var site = serverManager.Sites["Your-Site-Name"]; site.Limits.ConnectionTimeout = new TimeSpan(1, 0, 0);

A continuación, debe establecer la solicitud de tamaño máximo que permitirá el sitio. Esto está en un lugar totalmente diferente, en el módulo Request Fitlering. Es posible que este módulo no esté instalado de forma predeterminada en IIS7. Una vez más, Microsoft tiene buenas instrucciones sobre cómo configurar maxAllowedContentLength través de la GUI. Esto es algo que puede configurar desde dentro de Web.config:

<system.webServer> <security> <requestFiltering> <!-- Allow 1GB uploads --> <requestLimits maxAllowedContentLength="1073741824"></requestLimits> </requestFiltering> </security> </system.webServer>

Esta configuración se evalúa comparándola con el encabezado Content-Length y las solicitudes más grandes que esto darán como resultado inmediatamente un 404.13. La configuración está en bytes y lo que sigue es en Kilobytes, muy consistente en este IIS7.

Configuraciones de ASP.NET

A continuación, queremos limitar todas las solicitudes ASP.NET a 90 segundos / 4MB. Esto se puede hacer en el web.config:

<location> <system.web> <httpRuntime executionTimeout="90" maxRequestLength="4096" /> </system.web> </location>

Para hacer la configuración global, la etiqueta system.web está envuelta en una etiqueta de location que no tiene atributo de path . (En la pregunta original no envolví la etiqueta system.web en la etiqueta de ubicación que probablemente fue el origen de mi problema). maxRequestLength está en kilobytes esta vez.

Finalmente, queremos permitir que nuestra URL de carga especial acepte cargas enormes. Establecer estos valores por encima de los que configura globalmente no funcionará. Los valores globales anulan estas configuraciones.

<location path="Uploads/PostFile.rails"> <system.web> <httpRuntime executionTimeout="3600" maxRequestLength="1048576" /> </system.web> </location>

Si todo lo demás está bien configurado, debería hacerlo. Como sugirió Peter Bromberg, puede agregar tantos de estos bloques como sea necesario para aumentar los límites de URL específicas.

Una última nota: en el modo de depuración, IIS no impone el tiempo de espera de la conexión ni la configuración del tiempo de ejecución, para permitirle más tiempo para la depuración. Por lo tanto, para probar su configuración en una máquina de desarrollador, debe realizar una compilación de lanzamiento y debe establecer la configuración ''Habilitar depuración del lado del servidor'' en false .

Quiero diferentes límites de conexión para algunas URL en mi aplicación. Algunas URL aceptan cargas de archivos y necesitan tener un gran Tiempo de espera de conexión. Todas las demás URL necesitan un tiempo de espera mucho menor para evitar la denegación de servicio y no desperdiciar recursos.

Actualmente tengo la propiedad Tiempo de espera de conexión en IIS configurado para todo el sitio a 60 minutos. Entonces hice esto en la web.config:

<system.web> <httpRuntime executionTimeout="480" maxRequestLength="1024" /> </system.web> <location path="FileUpload/WriteFile.rails"> <system.web> <httpRuntime executionTimeout="3600" maxRequestLength="512000" /> </system.web> </location>

Así que esperaba que esto estableciera todas las URL en un tiempo de espera de 8 minutos y permitiera que la URL WriteFile.rails se ejecute durante 60 minutos. En su lugar, se permite que TODAS las URL se ejecuten durante 60 minutos. ¿Cómo consigo IIS para hacer lo que quiero?


Para establecer el tiempo de espera para una página específica, puede usar tantos elementos <ubicación ruta web.config como sea necesario:

<location path="Myfile.aspx"> <system.web> <httpRuntime executionTimeout="180"/> </system.web> </location>

Siempre que su ruta esté definida correctamente y la extensión .rails esté asignada a ASP.NET, esto debería funcionar. ¿Podría ser que el motor de ejecución ASP.NET no esté procesando las extensiones * .rails?

NOTA: Hombre, qué pésimo editor de correos. ¿Por qué no puedes hacer el escape para el usuario?


Siempre puede configurar ScriptTimeout directamente en la acción de su controlador. De esa manera, la configuración no se romperá si cambia su enrutamiento.