2010-02-18 7 views
6

Tenemos un sistema donde hospedamos un par de aplicaciones WCF en IIS. Algunas de estas aplicaciones tienen un poco de tiempo de inicio prolongado que toma un par de segundos (más de lo que los usuarios estarían encantados de esperar). Una vez que está en funcionamiento, todo es rápido, así que realmente es solo el tiempo de inicio.Cómo: evitar problemas de inicio en frío con aplicaciones WCF alojadas en IIS

El cliente también tiene el requisito de reciclar los grupos de aplicaciones todas las noches.

¿Hay alguna manera de activar todos estos servicios para que el tiempo de puesta en marcha no sea un problema para el primer usuario del sistema?

Pensamientos iniciales sobre dónde escribir un servicio de Windows que simplemente llame a un método liviano en cada servicio cada x (configurable) minutos para mantener las aplicaciones activas, pero dado que estamos en un entorno equilibrado de carga y las aplicaciones necesitan un host específico los encabezados que se aprobarán, siempre accederíamos a la dirección del saldo de carga, lo que significa que no hay forma de que podamos asegurarnos de que todos los servicios en todos los cuadros del clúster se inicien realmente.

Dado que una sola aplicación wcf en IIS solo puede tener un único encabezado de host, la única otra manera sería configurar un segundo sitio web iis apuntando a la misma aplicación. Simplemente no estoy seguro de si eso sería el truco, ya que sería en otro contexto de host.

otra opción podría ser escribir algo así como una extensión de IIS (no estoy seguro si esto aún es posible) que podría llamar a cada uno de nuestros servicios cuando IIS o el grupo de aplicaciones realmente se inicie de nuevo. (Algo que se da cuenta cuando el grupo de aplicación ha reciclado pero antes de la primera petición del usuario.

Cualquier idea sería muy apreciada.

Gracias

Gineer

+1

IIS7 tiene una característica llamada Application Warmup o similar. –

Respuesta

2

Para aquellos de nosotros que se ejecuta en una versión de IIS antes de 7.5, estamos en el proceso de probar la siguiente solución ...

Como se menciona en el post original, la idea inicial era disparar una WebRequest desde un servicio que se ejecuta en cada equipo a los sitios web locales (que alojan los servicios WCF), pero esto sería imposible, ya que todos hacen uso de encabezados de host, y todos ellos viven en una granja equilibrada de carga de red .

Pensamos que podríamos simplemente proporcionar los encabezados de host personalizados en la solicitud web al localhost.

Resulta que no puede actualizar el nombre del encabezado del host en una WebRequest. Es un campo de solo lectura.

Sin embargo, jugar con una clase proxy lo hace funcionar. Ver: http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1b35c665-fe32-4433-8877-a62f2d400a8e/

Y una pequeña parte de mi código de prueba a continuación en C#.

 WebRequest req = WebRequest.Create("<Correct Host name>"); 
     req.Proxy = new WebProxy("127.0.0.1"); 

     StreamReader stream = new StreamReader(
      req.GetResponse().GetResponseStream()); 

     StringBuilder sb = new StringBuilder(); 

     String LineString; 

     while ((LineString = stream.ReadLine()) != null) 
     { 
      if (LineString.Length > 0) 
       sb.Append(LineString); 
     } 
     stream.Close(); 

     String response = sb.ToString(); 

Puede que esta clase de proxy no sea la adecuada, pero parece funcionar de cualquier manera.

Gineer

Ps. No, no necesita tener ningún servidor proxy real instalado en la máquina host local.

3

excelente. Gracias Dercsár.

Después de un rápido Google, encontré la siguiente arctícula sobre el tema: Using the IIS Application Warm-Up Module

Las limitaciones aquí son que esto solo está disponible en Windows 2008 R2 con IIS 7.5. A pesar de que nuestro cliente está en proceso de actualización para ganar 2K8R2, es posible que aún tenga tiempo libre.

¿Alguien sabe de una solución que funcionaría para Windows 2003 con IIS 6 o tendremos que escribir algo para que esto funcione?

Gineer

Cuestiones relacionadas