una servidor publicar para paginas optimizar net mvc mostrar los lista lentas forbidden está este error directorio deploy contenidos configurado conexiones asp aplicacion asp.net asp.net-mvc iis iis-7

servidor - publicar asp.net core iis



ASP.NET MVC: primer acceso después de algunos minutos lento, luego cada solicitud siguiente es rápida (5)

Esta es casi sin duda la configuración de tiempo de espera inactivo de su grupo de aplicaciones (y no el código que se vuelve a compilar).

El tiempo de espera inactivo del grupo de aplicaciones predeterminado en IIS es de 20 minutos. Lo que significa que, si pasan 20 minutos y no llegan solicitudes a su aplicación, IIS cerrará el proceso de trabajo para su grupo de aplicaciones , haciendo que su aplicación vuelva a "congelarse". Quien haga la siguiente solicitud estará esperando varios segundos a medida que IIS reinicie el proceso de trabajo y "caliente" la copia de seguridad de su aplicación.

Si no desea que IIS "enfríe" automáticamente su aplicación después de un período de inactividad, puede desactivar el tiempo de inactividad del grupo de aplicaciones configurándola en 0.

cuando accedo a cualquier página de mi sitio web ASP.NET MVC por primera vez, esta primera solicitud es lenta. Necesita aproximadamente 4-5 segundos para cargar. Pero cada solicitud siguiente a cualquier página es rápida.

Cuando espero unos minutos o una hora, cada primera solicitud vuelve a ser lenta. Cada solicitud siguiente es rápida.

Creo que IIS 7 está compilando el código y manteniéndolo en la memoria. Después de un tiempo, lo eliminará de la memoria, por lo que debe volver a compilarlo.

¿Qué puedo hacer para que cada primera solicitud sea tan rápida como cada solicitud siguiente? (Sin precompilar mi fuente, si es posible)

¡Muchas gracias por adelantado!


Esta podría ser la configuración de los procesos del trabajador de reciclaje en el grupo de aplicaciones, verificar el valor para eso y, o bien desactivarlo o hacerlo más extenso.

También podría ser el proceso de trabajo de apagado después de estar inactivo en el rendimiento para el grupo de aplicaciones.

Probablemente sea el segundo, ya que el valor predeterminado es 20 minutos, el primero predeterminado es 29 horas, creo.


Si este es un servidor de producción, ¿por qué no intentas agregar un monitor de sitio web? como el tiempo de robot . Básicamente, solicita los encabezados de sus sitios web y obtiene códigos de estado como "200-ok", "404-not found", etc. cada 5 minutos. De esta forma, su sitio siempre se activa y no afecta a los archivos de registro / análisis, ya que solo se solicitan los encabezados. Utilizo esto para mis sitios en la nube ya que me parece que demoran 5 segundos en activarse, lo que afecta la carga del sitio. Con el monitor son instantáneos.

Ah, y es gratis para hasta 50 sitios!


Suponiendo que tiene un flujo regular de visitantes, esto no debería ser un problema en la producción. Además, a menos que esté alterando físicamente alguno de sus archivos fuente, IIS no lo recompilará cuando active su aplicación.

Además, eche un vistazo a la configuración de compilación de .NET disponible: http://technet.microsoft.com/en-us/library/cc725812(WS.10).aspx


tl; Dr

Después de realizar pruebas exhaustivas y recopilar fuentes relevantes para intentar resolver el problema, creo que la solución mínima puede ser (no verificada) para agregar este código al archivo global.asax:

protected void Application_End() { ... HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://web_domain.tld"); using (HttpWebResponse response = (HttpWebResponse) request.GetResponse()) { } ... }

En el momento de escribir la publicación, esto se usa para mantener de manera efectiva el sitio en el que trabajé ''siempre activo'', con la conjunción de establecer el Idle Time-out (minutes) en IIS en 0 como se menciona en otras respuestas. Sin embargo, creo que es posible que no sea necesario cambiar Idle Time-out (minutes) (suponiendo que el evento Application_end se active cuando se produce el cambio del grupo de aplicaciones al modo inactivo).

Cómo funciona (suponiendo que lo haga):

  1. Hay dos configuraciones en la configuración del grupo de aplicaciones de IIS que afectan cuando la aplicación se suspende o finaliza. Uno de ellos es Idle Time-out (minutes) que por defecto es de 20 minutos y cuando transcurre el tiempo especificado desde la última solicitud , el proceso de trabajo se suspende o finaliza. Cuando llega una próxima solicitud, el proceso de trabajo se reanuda o se inicia nuevamente y se genera el evento Application_start (y si el manejador Application_start se define en global.asax, se ejecuta). En el caso del proyecto en el que trabajé, Application_start tardó unos 17 segundos en completarse. Por lo tanto, si el sitio se ''dejó solo'' durante 21 minutos y luego llegó la nueva solicitud, tardó aproximadamente un poco más de 17 segundos antes de que la respuesta se enviara de vuelta (Application_start + procesamiento de la página). Cuando se envió otra solicitud en la ventana de 20 minutos, la respuesta se envió significativamente más rápido (quizás menos de 1), ya que el inicio de la aplicación ya se ha procesado.

Al establecer el valor de Idle Time-out (minutes) en 0, el proceso de trabajo nunca se suspenderá ni finalizará (al menos debido al tiempo de inactividad, puede haber otra causa que se describe a continuación).

  1. Además del Idle Time-out (minutes) , también está el ajuste del Regular time interval (minutes) en la sección Recycling de la configuración avanzada de IIS. Esto tiene un valor predeterminado de 1740 minutos (29 horas) y es una tarea programada regular que hace que el grupo de aplicaciones se recicle periódicamente (el período es fijo). Comprendí que esto es para evitar la acumulación de posibles fugas de memoria que, si están presentes, pueden bloquear el servidor al exhatar toda la memoria. El efecto del reciclaje de grupo de aplicaciones es que se genera el evento Application_end. Sin embargo, una vez que la aplicación finaliza, no se inicia automáticamente de nuevo, por lo que el evento Application_start no se genera hasta que llega una solicitud real (que es similar al primer caso). Entonces, en el caso de la aplicación web antes mencionada en la que trabajé, nuevamente tomaría aproximadamente 17 segundos procesar la primera solicitud para llegar después de que ocurriera el reciclaje. Cambiar este valor a 0 desactiva el reciclaje, pero supongo que es razonable no desactivar por completo el reciclaje debido a la posibilidad de acumulación de pérdidas de memoria a lo largo del tiempo (que posiblemente puede ser causado por errores en bibliotecas de terceros). Entiendo que las opiniones difieren sobre si establecer este valor en 0 o not y puede cambiar con el tiempo.

Solución posible (sin cambiar la configuración de IIS): si las solicitudes se envían con la frecuencia suficiente, es posible que la aplicación nunca cambie al modo Inactivo. En el caso de reciclaje, esto también provocaría que la aplicación vuelva a comenzar. Esto se puede lograr, por ejemplo, utilizando un servicio de terceros como se describe en @Rippo.

Solución propuesta: se ha observado que el reciclaje de grupos de Application_end provocado el evento Application_end . Suponiendo que también se genera al cambiar el grupo de aplicaciones al modo inactivo , parece suficiente crear una solicitud en el controlador de eventos Application_end para el sitio web, lo que en ambos casos provocaría que la aplicación vuelva a comenzar (elevando el Evento Application_start). El código está en la parte superior de la respuesta.