Caching im WebAPI

WebAPI Aufrufe liefern Daten zurück die für den Client als nicht zu cachen markiert sind also nicht zwischengespeichert werden dürfen. Das ist auch meistens die richtige Einstellung, da ein Client meisten aktuelle Daten benötigt. Allerdings kann das auch zu einer hohen Last am WebServer führen. Wenn es um effiziente Programmierung geht, empfiehlt es sich Daten zu identifizieren, die zwischengespeichert werden können. Das sind meist Stammdaten, da sich diese nicht so häufig ändern.

In der http-Welt wird Caching über Header gesteuert. das ist auch beim Ergebnis von WebAPI Aufrufen so. D.h. es gilt die richtigen Header im Ergebnis mitzugeben. mit “Cache-Control” kann generell gesteuert werden ob die Proxies die Daten zwischenspeichern dürfen. mit den Headern “expires”, “maxAge”, oder auch “lastModifed” kann der Zeitpunkt des Ablaufens der Daten bestimmt werden. Die Aufgabe besteht nur darin, die entsprechenden Header in den Response zu schreiben.

Caching Add-Ins

Zum Glück haben auch andere diese Aufgaben und daher sind im Web einige Add-Ins zu finden die diese Aufgabe bereits gelöst haben. Z.B: ist unter https://gist.github.com/bradwilson/8586562 das Add In von Brad Wilson zu finden.

Er hat eine Extension-Methode für das Interface IHttpActionResult geschrieben. Mit dieser Methode ist es mit einem einfachen Aufruf möglich die entsprechenden Header zu einem ActionResult hinzuzufügen. Weiters ist im Download die Klasse CachedResult zu finden. Diese ist dafür verantwortlich die Header einzutragen. In Summe liefert der Download 3 Dateien, die in das WebAPI Projekt aufzunehmen sind. (Cachability.cs, CachedResult.cs, HttpActionResultExtensions.cs)

Anwendung

Möchte man nun, dass die Browser ein Ergebnis zwischenspeichern, muss die Controller-Methode zunächst ein IHttpActionResult zurückliefern. Die Methode sollte nun so aussehen:

1 public IHttpActionResult get() 2 { 3 var ctx = new NorthwindEntities(); 4 var ergebnis = from c in ctx.Customers 5 select new { CompanyName = c.CompanyName, Country = c.Country }; 6 7 return Ok(ergebnis); 8 }

Wenn die Dateien eingebunden sind, dann steht nun bei OK die Erweiterungsmethode Cached zur Verfügung und wir können nun diese Methode gleich im return aufrufen und die Header entsprechend setzen. Die neue Methode kann do aussehen:

1 public IHttpActionResult get() 2 { 3 var ctx = new NorthwindEntities(); 4 var ergebnis = from c in ctx.Customers 5 select new { CompanyName = c.CompanyName, Country = c.Country }; 6 7 return Ok(ergebnis).Cached(Cacheability.Public, 8 expires:DateTime.Now.AddHours(1)); 9 }

Durch Verwendung dieses Add-Ins ist es nun mit sehr wenig Aufwand möglich Ergebnisse zu liefern die vom Browser und/oder den Proxy-Servern zwischengespeichert werden dürfen.

Kommentare sind geschlossen