2011-09-12 18 views
16

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 ha sido eliminado desde hace algún tiempo.¿Cómo calentar una aplicación ASP.NET MVC en IIS 7.5?

La aplicación se debe calentar cada vez que se reinicie el proceso de trabajo 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 compiladas en la mayoría de los lugares y hemos implementado vistas compiladas 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 compiladas y no compiladas se ejecuten al menos una vez antes de que cualquier usuario final tenga acceso a la aplicación.

+0

Relacionado: http://stackoverflow.com/questions/13250679/how-to-warm-up-entity-framework-when-does-it-get-cold –

+0

Pruebe comprobar [mi solución] (http: // stackoverflow.com/questions/15348621/iis-7-5-application-initialization-for-asp-net-web-service-warmup-without-rema/15367638?noredirect=1#comment33723748_15367638). No devolverá un código de estado especial, sino que esperará a que el calentamiento responda a las solicitudes. – Jason

Respuesta

9

Puede echar un vistazo a following post para la característica Auto-Start integrada en IIS 7.5 y ASP.NET 4.0.

+0

Gracias por interesarse en esto. Consulte "ACTUALIZAR 1" en la consulta original, que ofrece más contexto para el problema. Usar el método especificado en el blog de ScottGu puede no ayudar a cumplir todos los requisitos que tenemos. Necesitamos tener el sitio en vivo, pero no accesible para todos hasta que se caliente. Necesitamos recorrer nuestras páginas antes de permitir que todos puedan acceder a ellas. –

+0

@Dhwanil Shah, el calentamiento ocurre cuando IIS comienza a ejecutarse, es decir, después de que su servidor se reinicia y mucho antes de que la primera solicitud haya tenido tiempo de acceder a su aplicación. –

+0

¿Podré acceder a las páginas de mi sitio desde el código dentro de una implementación de IProcessHostPreloadClient? –

4

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. Normalmente, el calentamiento se utiliza para:

  • Inicio de 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 compilació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 reiniciar 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.

+3

Puede precompilar las páginas antes de la implementación (durante su proceso de compilación), que tiene un beneficio adicional de encontrar errores que no se detectan durante la compilación de C#/VB.NET. –

+0

@Michael - Gracias por interesarse en esto. Compruebe la "ACTUALIZACIÓN 1" para obtener más contexto en la consulta. –

+0

@Jakub - Estamos utilizando la compilación previa de ASP.NET. –

9

Microsoft ha lanzado un módulo que hace exactamente lo que usted solicita. El Application Initialization Module for IIS 7.5 mejora la receptividad 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 following tutorial from 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 recicla, IIS no cambia el tráfico activo al nuevo proceso de trabajo reciclado hasta que el nuevo proceso de trabajo finalice la ejecución de 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 es available for download for IIS 7.5.

Cuestiones relacionadas