Thomas Bandt

Über mich | Kontakt | Archiv

ASP.NET MVC - Vorsicht beim OutputCaching

Nur eine kurze Anmerkung zu einem Verhalten, welches mir in der letzten Woche auf die Füße gefallen ist: ich habe in einer Controller-Action das Laden eines Twitter-Feeds veranlasst, welches natürlich ein wenig Zeit in Anspruch nimmt. Deshalb wollte ich die geladenen Tweets einfach cachen und habe dafür zum OutputCache-Attribut von ASP.NET MVC gegriffen. Damit kann man ja in Windeseile ein einfaches Caching implementieren:

   1:  [OutputCache(Duration=60)]
   2:  public ActionResult Index()
   3:  {
   4:      var data = Repository.GetData();
   5:      return View(data);
   6:  }

Das Ganze funktionierte auch, ab dem zweiten Aufruf war alles in Nullkommanix geladen. Bis ich später darauf aufmerksam wurde, dass die Seite in zwei Browsern plötzlich völlig unterschiedlich aussah. Nach etwas Ratlosigkeit ob dieses Verhaltens war die Ursache dann schnell gefunden:

In der vom View verwendeten Masterpage gibt es im HTML-Head eine Stelle, in der, sofern die Seite mit dem Internet Explorer aufgerufen wird, ein paar gesonderte Style-Angaben gerendert werden. Die Entscheidung, ob dies geschieht, fällt serverseitig über eine einfache if-Abfrage. Rief man nun die Website nach dem Kompilieren zuerst mit dem IE auf, wurden nun diese Styles auch im Firefox angewandt.

Was passierte da? Klar: das OutputCaching greift tatsächlich für den kompletten Response-Stream, und nicht nur partiell für den Teil der View, für den es (eigentlich) deklariert ist. Das heißt auch der komplette Inhalt der Masterpage landet mit im Cache.

Einen konkreten Workaround habe ich an dieser Stelle dann nicht gesucht sondern das Caching auf herkömmliche Weise selbst erledigt, d.h. die Tweets einfach in HttpContext.Current.Cache abgelegt. Das funktioniert ja auch problemlos mit ASP.NET MVC ;-).



« Zurück  |  Weiter »