2012-06-21 34 views
12

Estoy ejecutando una aplicación web en IIS 7.5 y necesita reciclar ocasionalmente (de lo contrario, el uso de memoria se pierde, algo que estoy buscando).Reciclaje de grupo de aplicaciones IIS + programación de cuarzo

Cuando se recicla, no se ejecuta hasta que entra otra solicitud, que el cuarzo no se ejecutará.

¿Hay alguna forma de que IIS muestre automáticamente 1 proceso de trabajo inmediatamente después de reciclar el grupo de aplicaciones para garantizar que el cuarzo siempre esté en línea?

+0

¿No debería alojar host de cuarzo en el Servicio de Windows? –

+0

@JakubKonecki, ese sería mi plan b, es solo un esfuerzo más que hospedarlo dentro de la aplicación, ya que el programador solo interactúa con la aplicación. –

+2

debería haber sido el plan A ;-) http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx –

Respuesta

13

Sí!

http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx detalles que bastante bien, básicamente, que necesitan:

  1. Editar C: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config incluir:

    <applicationPools> 
        <add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" /> 
    </applicationPools> 
    
  2. declarar lo debe ejecutarse como el "precalentamiento" para su sitio

    <sites> 
        <site name="MySite" id="1"> 
         <application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="PreWarmMyCache" /> 
        </site> 
    </sites> 
    <serviceAutoStartProviders> 
        <add name="PreWarmMyCache" type="PreWarmCache, MyAssembly" /> 
    </serviceAutoStartProviders> 
    
  3. configurar la aplicación con cualquier lógica de "calentamiento" que le gustaría:

    public class PreWarmCache : System.Web.Hosting.IProcessHostPreloadClient { 
        public void Preload(string[] parameters) { 
         // Perform initialization and cache loading logic here... 
        } 
    } 
    

Nota: Si todo lo que necesita es para el proceso w3wp.exe de estar presente Creo único paso 1 es necesario. Si también necesita otros elementos (como ciertas cosas para cargar en la memoria), también se usarán los pasos 2 y 3.

+0

Perdón por golpear un tema viejo, pero ¿dónde exactamente debería estar ubicada esta clase de calentamiento en el proyecto mvc4? –

+0

@StephenS.Gracias, pero no funcionó para mí, como se indica en [No se puede mantener la aplicación web viva en IIS después de reciclar o reiniciar] (http://stackoverflow.com/questions/33593602/cannot-keep-alive-web-application-on-iis después de reciclar o reiniciar). Cualquier ayuda por favor? –

+0

Para otros como yo, que tratamos de usar notepad ++ u otro editor para editar la aplicaciónHost.config, esta respuesta en SO ayudó (básicamente, usa el bloc de notas): [link] (http://stackoverflow.com/a/13335092/2506135) –

0

Investigué este problema. Mientras que Stephen's answer mantendrá la aplicación ejecutándose, en un entorno Spring.Net, el framework no se iniciará y Quartz no se ejecutará. Puse en marcha una implementación de IProcessHostPreloadClient que lanzará una solicitud real a la aplicación para que toda la maquinaria funcione. Esto también se registró on my blog:

public class Preloader : System.Web.Hosting.IProcessHostPreloadClient 
{ 
    public void Preload(string[] parameters) 
    { 
     var uris = System.Configuration.ConfigurationManager 
         .AppSettings["AdditionalStartupUris"]; 
     StartupApplication(AllUris(uris)); 
    } 

    public void StartupApplication(IEnumerable<Uri> uris) 
    { 
     new System.Threading.Thread(o => 
     { 
      System.Threading.Thread.Sleep(500); 
      foreach (var uri in (IEnumerable<Uri>)o) { 
       var client = new System.Net.WebClient(); 
       client.DownloadStringAsync(uris.First()); 
      } 
     }).Start(uris); 
    } 

    public IEnumerable<Uri> AllUris(string userConfiguration) 
    { 
     if (userConfiguration == null) 
      return GuessedUris(); 
     return AllUris(userConfiguration.Split(' ')).Union(GuessedUris()); 
    } 

    private IEnumerable<Uri> GuessedUris() 
    { 
     string path = System.Web.HttpRuntime.AppDomainAppVirtualPath; 
     if (path != null) 
      yield return new Uri("http://localhost" + path); 
    } 

    private IEnumerable<Uri> AllUris(params string[] configurationParts) 
    { 
     return configurationParts 
      .Select(p => ParseConfiguration(p)) 
      .Where(p => p.Item1) 
      .Select(p => ToUri(p.Item2)) 
      .Where(u => u != null); 
    } 

    private Uri ToUri(string value) 
    { 
     try { 
      return new Uri(value); 
     } 
     catch (UriFormatException) { 
      return null; 
     } 
    } 

    private Tuple<bool, string> ParseConfiguration(string part) 
    { 
     return new Tuple<bool, string>(IsRelevant(part), ParsePart(part)); 
    } 

    private string ParsePart(string part) 
    { 
     // We expect IPv4 or MachineName followed by | 
     var portions = part.Split('|'); 
     return portions.Last(); 
    } 

    private bool IsRelevant(string part) 
    { 
     var portions = part.Split('|'); 
     return 
      portions.Count() == 1 || 
      portions[0] == System.Environment.MachineName || 
      HostIpAddresses().Any(a => a == portions[0]); 
    } 

    private IEnumerable<string> HostIpAddresses() 
    { 
     var adaptors = System.Net.NetworkInformation 
          .NetworkInterface.GetAllNetworkInterfaces(); 
     return adaptors 
       .Where(a => a.OperationalStatus == 
          System.Net.NetworkInformation.OperationalStatus.Up) 
       .SelectMany(a => a.GetIPProperties().UnicastAddresses) 
       .Where(a => a.Address.AddressFamily == 
          System.Net.Sockets.AddressFamily.InterNetwork) 
       .Select(a => a.Address.ToString()); 
    } 
} 
-3

O simplemente podría modificar el método "Application_Start" en Global.asax para asegurar que Quortz se está ejecutando.

+2

Application_Start solo se invoca durante la primera solicitud después del reciclado o inicio, este no es el comportamiento deseado. –

1

Comenzando con IIS 8.0, hay una opción para simular una solicitud a la página raíz, por lo tanto, una inicialización completa de la aplicación: Configuración avanzada del conjunto de aplicaciones -> Precarga habilitada = verdadera.

Por supuesto, startMode debe ser AlwaysRunning.

Más detalles sobre cómo habilitar esta característica se pueden encontrar here.

Cuestiones relacionadas