IIS OUTPUT CACHE DURCH CRAWLER VORCRAWLEN

Tags: iis, caching

Um die performance einer Web Applikation zu Optimieren gibt es die möglichkeit den Output Cache des IIS bzw. ASP.Net durch einen WebCrawler vorgenerieren zu lassen.

Durch den vorgenerierten Cache wird jeder Aufruf vom Cache behandelt bzw. beantwortet. Vorrausgesetzt das die angeforderte Ressource sich noch im Cache befindet.
(siehe IIS Tuning – Cache und Performance )

Wie bei allem gibt es auch für diese Aktion mehrere Varianten:

Varianten:

Output Cache manuell vorgenerieren

Manuel vorgenerieren heißt in diesem Fall jede Seite durch einen Browser aufrufen.

Mag bei einer kleinen Applikation / Webseite schnell gehen (meistens ist die Applikation aber nicht so klein ).
Falls es sich allerdings um eine “übliche” Applikation mit zig Formularen / Webseiten handelt kann diese Variante sehr sehr sehr Zeitaufwendig werden.

Output Cache durch einen WebCrawler vorgenerieren

Das ist die Variante die wir  doch alle bevorzugen.
Ein kleines Programm / Tool erledigt die Arbeit für uns.

Für einen Entwickler der C# beherscht könnte das so aussehen :

public static void Main(string[] args)
{
    // An dieser Stelle solllte man eine vorgenerierte Liste aller Seiten haben (Sitemap?)
    List<string> sites = new List<string>();
    sites.Add("www.domain.de");
    sites.Add("www.domaind.de/site1.html");
    sites.Add("www.domaind.de/site2.html");
    sites.Add("www.domaind.de/site3.html");
    sites.Add("www.domaind.de/site4.html");
 
    foreach(var site in sites)
    {
        HttpRequest request = WebRequest.CreateHttpRequest(site);
    }
}

Nachdem das Programm erfolgreich gestartet und beendet wurde kann man nun einen Browser starten und die Webseite aufrufen.

Mit vollen Erwartungen das die Webseite auf dem Server gecached wurde, wird man ernüchternd feststellen das die Antwort Zeiten immer noch so langsam sind.

Falls nicht, herzlichen Glückwunsch!
Du brauchst nicht mehr weiterlesen.

Wenn du es doch wissen willst und natürlich für alle anderen, bei denen die Antwort Zeiten dem ungecachtem Zustand ähneln:

  • Nein das Programm hat keinen Fehler.
  • Ja der IIS bzw. das ASP.Net hat die Anfrage nicht aus dem Output Cache beantwortet.
  • Ja die Anfrage wurde neu generiert.

Tja, dumm gelaufen.
Spaß beiseite,  eigentlich ist es eine ganz einfache Sache:

Das liegt daran das bei einer ASP.Net Applikation, gehostet im IIS, von Haus aus der Session Mode aktiviert ist.
Dadurch sendet der IIS einen Session Cookie mit,  der bei jeder weiteren Anfragen vom gleichen Clienten geprüft wird.
Erst wenn der IIS eine gültige Session hat wird er den Output Cache anwerfen.

Ein Browser akzeptiert im Normal Fall Cookies und sendet diese bei jedem weiteren Aufruf an den Server.

Im Klartext:

Der Client (WebCrawler) muß mit Cookies umgehen können d.h.
Cookies akzeptieren und Cookies wieder zurück an den Server senden.

Lösung

Da unser Programm kein Browser ist hat er in der aktuellen Logik keine Ahnung was Cookies sind.

Also müssen wir das Programm etwas anpassen.

Logisch betrachtet muß der WebCrawler eine Anfrage machen um den Session Cookie zu erhalten.
Dieser muß zwischengespeichert werden, damit wir den Cookie bei allen weiteren Anfragen hinzufügen können.

Beispiele für Cookie Handling in C# bzw. Visual Basic (VB)

Session Mode deaktivieren ?

Natürlich könnte man auch die Session Eigenschaft des IIS deaktivieren. Dann würde jeder Request den Output Cache anwerfen.
Ist allerdings nicht bei jeder Applikation empfehlenswert ;)

Kein Kommentar

Einen Kommentar hinzufügen