Pregunta

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 más pequeño para evitar la denegación del servicio y no desperdiciar recursos.

Actualmente tengo la propiedad de tiempo de espera de conexión en IIS establecida para todo el sitio a 60 minutos. Luego 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 establezca todas las URL en un tiempo de espera de 8 minutos y permitiera que la URL de redacción de Write.Rails funcione durante 60 minutos. En cambio, todas las URL pueden funcionar durante 60 minutos. ¿Cómo consigo que IIS haga lo que quiero?

¿Fue útil?

Solución

La pregunta se hizo específicamente sobre los tiempos de espera pero también la configuración implícita de MaxRequestLength también. Voy a intentar dar una respuesta realmente completa a ambos problemas (ahora que he pasado la mayor parte del día calculándolo).

Digamos que tenemos una sola URL en nuestro sitio web que queremos procesar las cargas de archivos. Queremos asumir un gigabyte de datos sobre esa URL y permitiremos que los clientes estén conectados para, 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 posterior.

Configuración global

Primero debe elevar globalmente los límites a tiempo y tamaño para todo el sitio. Primero desea establecer 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 el Web.Config. El sitio web de IIS7 tiene Buenas instrucciones aquí. También puede hacerlo programáticamente con el Microsoft.Web.Administration biblioteca 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 lo permita el sitio. Esto está en un lugar totalmente diferente, en el módulo de ajuste de solicitud. Este módulo no se puede instalar de forma predeterminada en IIS7. De nuevo Microsoft tiene Buenas instrucciones para cómo establecer el maxAllowedContentLength a través de la GUI. Esto es algo que puede establecer 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 contra el Content-Length encabezado y solicitudes más grandes que esto darán como resultado un 404.13. La configuración está en bytes y lo que viene a continuación es en kilobytes, muy consistente este IIS7.

Configuración de ASP.NET

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

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

Para hacer que la configuración globalice el system.web La etiqueta está envuelta en un location Etiqueta que no tiene path atributo. (En la pregunta original, no envolví el sistema. Etiqueta Web en la etiqueta de ubicación que probablemente era la fuente de mi problema). maxRequestLength está en kilobytes esta vez.

Finalmente, queremos permitir que nuestra URL de carga especial acepte grandes cargas. Establecer estos valores más altos que los que establece a nivel mundial no funcionarán. 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á configurado correctamente, eso debería hacerlo. Como sugirió Peter Bromberg, puede agregar tantos bloques como sea necesario para elevar los límites para URL específicas.

Una última nota: en el modo de depuración, IIS no aplica el tiempo de espera de conexión o la configuración de ejecución, para permitirle más tiempo para la depuración. Entonces, para probar su configuración en una máquina de desarrollador, debe hacer una compilación de versión y debe establecer la configuración de 'habilitar la depuración del lado del servidor' en false.

Otros consejos

Siempre puede establecer el scripttimeut directamente en su acción del controlador. De esa manera, la configuración no se romperá si cambia su enrutamiento.

Para establecer el tiempo de espera para una página específica, puede usar tantos

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

Mientras su ruta se define correctamente, y la extensión .Rails se asigna a ASP.NET, esto debería funcionar. ¿Podría ser que el motor de ejecución de ASP.NET no está procesando *.Rails Extensions?

Nota: Hombre, qué pésimo editor de publicaciones. ¿Por qué no puedes escapar para el usuario?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top