2012-06-21 16 views
12

Używam aplikacji sieci Web w IIS 7.5 i trzeba ją od czasu do czasu przetwarzać (w przeciwnym razie użycie pamięci wymyka się spod kontroli, coś, czego szukam!).Recykling puli aplikacji IIS + planowanie kwarcu

Po ponownym uruchomieniu nie działa, dopóki nie pojawi się inne żądanie, którego kwarc nie będzie działał.

Czy jest jakiś sposób, aby usługi IIS automatycznie wywoływały 1 proces roboczy natychmiast po przetworzeniu puli aplikacji, aby kwarc był zawsze dostępny online?

+0

Czy nie powinieneś obsługiwać kwarcu w usłudze Windows? –

+0

@JakubKonecki, to byłby mój plan b, to tylko więcej wysiłku niż hostowanie go w aplikacji, ponieważ harmonogram tylko współdziała z aplikacją. –

+2

powinien być plan A ;-) http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx –

Odpowiedz

13

Tak!

http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx szczegóły to całkiem ładnie, w zasadzie trzeba:

  1. Edit C: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config obejmuje:

    <applicationPools> 
        <add name="MyAppWorkerProcess" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" /> 
    </applicationPools> 
    
  2. stwierdzenie co powinny być uruchamiane jako „rozgrzewkę” na swojej stronie

    <sites> 
        <site name="MySite" id="1"> 
         <application path="/" serviceAutoStartEnabled="true" serviceAutoStartProvider="PreWarmMyCache" /> 
        </site> 
    </sites> 
    <serviceAutoStartProviders> 
        <add name="PreWarmMyCache" type="PreWarmCache, MyAssembly" /> 
    </serviceAutoStartProviders> 
    
  3. Konfiguracja aplikacji z jakiegokolwiek „warm-up” logiki chcesz:

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

Uwaga: Jeśli wszystko, co potrzebne jest dla proces w3wp.exe być obecny wierzę tylko krok 1 jest konieczne. Jeśli potrzebujesz również innych przedmiotów (np. Niektórych rzeczy, które mają być załadowane do pamięci), będą również używane kroki 2 i 3.

+0

Przepraszamy za napotkanie starego tematu, ale gdzie dokładnie powinna się znajdować ta klasa rozgrzewki w projekcie mvc4? –

+0

@ StephenS.Dzięki, ale to nie zadziałało, jak wskazano na [Nie można utrzymać żywej aplikacji sieciowej na IIS po Recyklingu lub ponownym uruchomieniu] (http://stackoverflow.com/questions/33593602/cannot-keep-alive-web-application-on-iis po ponownym uruchomieniu lub ponownym uruchomieniu). Każda pomoc pls? –

+0

Dla innych, takich jak ja, którzy próbują użyć notatnika ++ lub innego edytora do edycji pliku applicationHost.config, ta odpowiedź na SO pomogła (w zasadzie, użyć notatnika): [link] (http://stackoverflow.com/a/13335092/2506135) –

0

Rozwiązałem ten problem. Podczas gdy Stephen's answer utrzyma działanie aplikacji, w środowisku Spring.Net, struktura nie zostanie uruchomiona, a Quartz nie uruchomi się. Przygotowałem implementację IProcessHostPreloadClient, która uruchomi prawdziwą prośbę do aplikacji, aby uruchomić wszystkie maszyny. Jest to również wysłana 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

Albo może po prostu zmodyfikować „Application_Start” Sposób w Global.asax aby Quortz jest uruchomiony.

+2

Application_Start jest wywoływana tylko podczas pierwszego żądania po ponownym uruchomieniu lub uruchomieniu, nie jest to pożądane zachowanie. –

1

Począwszy od wersji IIS 8.0 istnieje opcja symulacji żądania do strony głównej, a więc pełna inicjalizacja aplikacji: ustawienia zaawansowane puli aplikacji -> Wstępnie załadowane włączone = true.

Oczywiście tryb startMode powinien być ustawiony na Zawsze.

Więcej informacji o tym, jak włączyć tę funkcję, można znaleźć here.

Powiązane problemy