Kiedy i gdzie wykonać czasochłonne operacje inicjalizacyjne w ASP.NET 4.0

Rozważmy architekturę w której na początku ładujemy dane do cache a następnie na poszczególnych stronach wyświetlamy dane zbuforowane. Przyspieszy to oczywiście znacząco działanie aplikacji. Jednym z podejść jest załadowanie danych w momencie startu aplikacji (plik global). Rozwiązanie dobre jednak metoda Application_Start jest wywoływana tak naprawdę w momencie otrzymania pierwszego zapytania – czyli w sytuacji gdy pierwszy użytkownik naszego serwisu próbuje otworzyć stronę. Taki użytkownik doświadczy niższej wydajności systemu niż pozostali. Jednym z rozwiązań przedstawionego problemu jest wysyłanie sztucznych zapytań, które spowodują wywołanie Application_Start.

Najlepszym jednak podejściem jest wykorzystanie interfejsu IProcessHostPreloadClient i zaimplementowanie metody, która będzie wykonana przed przyjściem zapytań HTTP:

  1. Otwieramy plik konfiguracyjny applicationHost.config. Znajduje się on w C:\Windows\System32\inetsrv\config\applicationHost.config. Odnajdujemy nasz applicationPool i dodajemy\modyfikujemy atrybut startMode.
    <applicationPools>
         <add name="nazwa pool" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
    </applicationPools> 

  2. Odnajdujemy definicję strony i dokonujemy kilka modyfikacji (serviceAutoStart) podłączających naszą klasę implementującą interfejs IProcessHostPreloadClient :
    <sites>
        <site name="MySite" id="1">
            <application path="/"
            serviceAutoStartEnabled="true"
            serviceAutoStartProvider="Warmup" >
        </application>
        </site>
    </sites>
    
    <serviceAutoStartProviders>
      <add name="Warmup" 
           type="WebApp.PreWarmUp, WebApp" />
    </serviceAutoStartProviders>

  3. Na koniec wystarczy zaimplementować odpowiednią klasę:
public class PreWarmUp :IProcessHostPreloadClient
{
    public void Preload(string[] parameters)
    {
        // implementacja czasochłonnych operacji
    }
}

W metodzie Preload możemy umieścić kod, który ma zainicjalizować dane jeszcze przed przyjściem jakichkolwiek zapytań.

Leave a Reply

Your email address will not be published.