¿Cómo calentar una aplicación ASP.NET MVC en IIS 7.5?

Nos gustaría calentar una aplicación ASP.NET MVC alojada en el servidor IIS 7.5. El módulo de calentamiento que solía estar disponible en http://forums.iis.net/t/1176740.aspx se ha eliminado desde algún momento.

La aplicación se debe calentar cada vez que se reinicie el proceso de trabajo de IIS o ASP.NET por algún motivo. Durante el período de calentamiento, IIS debe devolver algún código de estado HTTP que indique su estado de calentamiento o su incapacidad para servir a cualquier cliente.

¿Sería una buena idea crear un ejecutable que navegue por las páginas necesarias en el sitio a través de HttpRequests? El ejecutable se puede activar desde la implementación de IProcessHostPreloadClient. ¿Es posible configurar IIS para que solo acepte solicitudes de localhost y una vez que se haya ejecutado, pueda pasar a todos los clientes, pero ese interruptor no debería desencadenar un reinicio de IIS (obviamente).

¿Es posible utilizar Visual Studio 2010 – Web Performance Test para calentar una aplicación en lugar de crear un ejecutable manual? ¿Alguna otra alternativa?

PD: la aplicación utiliza la Autenticación de formularios y usa sesiones, por lo que es importante mantener las cookies de estado y otras cookies.

ACTUALIZACIÓN 1 – Estamos utilizando .NET Framework 4.0 y Entity Framework (base de datos primero) en nuestra aplicación. La primera vez que aciertas las consultas de EF son lentas. La razón detrás del calentamiento es sacar estas primeras visitas del camino. Ya estamos utilizando consultas comstackdas en la mayoría de los lugares y hemos implementado vistas comstackdas previamente para EF. El tamaño del modelo y la aplicación es muy grande y complejo. El calentamiento necesita recorrer muchas páginas para garantizar que las consultas EF comstackdas y no comstackdas se ejecuten al menos una vez antes de que cualquier usuario final tenga acceso a la aplicación.

Microsoft ha lanzado un módulo que hace exactamente lo que usted solicita. El módulo de inicialización de aplicaciones para IIS 7.5 mejora la capacidad de respuesta de los sitios web al cargar las aplicaciones web antes de que llegue la primera solicitud.

Puede especificar una serie de URL que IIS precargará antes de aceptar solicitudes de usuarios reales. No creo que pueda obtener una verdadera experiencia de inicio de sesión de usuario, pero ¿puede configurar páginas simuladas que no requieran un inicio de sesión que cumpla con el mismo calentamiento que usted solicita?

La característica que creo que es más convincente es que este módulo también permite el reciclaje de procesos superpuestos. El siguiente tutorial de IIS 8.0 incluye un enfoque paso a paso sobre cómo habilitar el reciclaje de procesos superpuestos.

Cuando IIS detecta que un proceso de trabajo activo se está reciclando, IIS no cambia el tráfico activo al nuevo proceso de trabajo reciclado hasta que el nuevo proceso de trabajo termina de ejecutar todas las URL de inicialización de la aplicación en el nuevo proceso. Esto garantiza que los clientes que naveguen por su sitio web no vean las páginas de inicialización de la aplicación una vez que la aplicación esté activa y en ejecución.

Este módulo de inicialización de la aplicación IIS está integrado en IIS 8.0, pero está disponible para su descarga en IIS 7.5 .

Puede echar un vistazo a la siguiente publicación para la característica Auto-Start integrada en IIS 7.5 y ASP.NET 4.0.

Cualquier aplicación que genere una solicitud de servidor para los recursos alojados se puede utilizar para calentar un proceso de IIS. Exactamente cuántas solicitudes necesita depende de qué partes necesitan calentamiento. Por lo general, el calentamiento se usa para:

  • Iniciando un proceso de trabajo. Para esto, solo necesita pedir un recurso para calentar un proceso para toda la aplicación.
  • Realice cualquier inicialización estática, inicio de la base de datos o precaching. Cualquier cosa que haga en su archivo Global.asax ocurrirá cuando haga su primera solicitud, de modo que si puede hacer que toda su inicialización suceda, entonces, solo tendrá que hacer una solicitud de una página.
  • Forzar la comstackción previa de páginas ASP.NET. Para que esto suceda, deberías acceder a todas las páginas. Afortunadamente, este costo no es muy alto, por lo que es probable que no tenga que preocuparse por ello. Si tiene páginas individuales que se cargan lentamente, puede calentarlas por separado.

El proceso de “calentamiento” aquí no es nada mágico. Solo necesita obligar a IIS a servir la URL en cuestión. Todo lo que usted mencionó se encargaría de eso: al usar una herramienta de prueba de estrés para consultar la URL, escribir una utilidad personalizada para publicar solicitudes HTTP, incluso el simple hecho de crear una herramienta como ‘wget’ o un script de PowerShell para descargar las URL lo haría .

En cuanto a restringir el acceso a localhost, hasta donde yo sé, dentro de IIS, la única manera de cambiar eso requiere que reinicies IIS. Siempre puede crear un enganche previo a la solicitud en su aplicación y mantener el estado allí, y hacer que su proceso de precalentamiento consulte una URL específica que active ese estado para “abrir”. Pero no estoy seguro de lo que lograrías. Si, de alguna manera, un usuario intenta consultar su sitio antes de que finalice su calentamiento, todo lo que sucedería es que su sitio demoraría mucho tiempo en responder, y eventualmente obtendría la página solicitada. Si los bloqueó fuera del sitio durante el calentamiento, en su lugar obtendrían un error de red del navegador que afirmaba que el sitio estaba fuera de línea, lo que (para mí) suena mucho peor.