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:
- 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>
- 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>
- 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ń.