Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
von Microsoft
In diesem Tutorial erfahren Sie, wie Sie die Leistung Ihrer ASP.NET MVC-Webanwendungen erheblich verbessern können, indem Sie die Vorteile der Ausgabezwischenspeicherung nutzen. Sie erfahren, wie Sie das von einer Controlleraktion zurückgegebene Ergebnis zwischenspeichern, sodass nicht jedes Mal derselbe Inhalt erstellt werden muss, wenn ein neuer Benutzer die Aktion aufruft.
In diesem Tutorial wird erläutert, wie Sie die Leistung einer ASP.NET MVC-Anwendung erheblich verbessern können, indem Sie den Ausgabecache nutzen. Mit dem Ausgabecache können Sie die von einer Controlleraktion zurückgegebenen Inhalte zwischenspeichern. Auf diese Weise muss nicht jedes Mal derselbe Inhalt generiert werden, wenn dieselbe Controlleraktion aufgerufen wird.
Angenommen, Ihre ASP.NET MVC-Anwendung zeigt eine Liste von Datenbankdatensätzen in einer Ansicht namens Index an. Normalerweise muss jedes Mal, wenn ein Benutzer die Controlleraktion aufruft, die die Indexansicht zurückgibt, der Satz von Datenbankdatensätzen aus der Datenbank abgerufen werden, indem eine Datenbankabfrage ausgeführt wird.
Wenn Sie hingegen den Ausgabecache nutzen, können Sie vermeiden, dass bei jedem Aufruf derselben Controlleraktion ein Benutzer eine Datenbankabfrage ausführt. Die Ansicht kann aus dem Cache abgerufen werden, anstatt von der Controlleraktion neu generiert zu werden. Mit der Zwischenspeicherung können Sie redundante Arbeit auf dem Server vermeiden.
Aktivieren der Ausgabezwischenspeicherung
Sie aktivieren die Ausgabezwischenspeicherung, indem Sie entweder einer einzelnen Controlleraktion oder einer gesamten Controllerklasse ein [OutputCache]-Attribut hinzufügen. Beispielsweise macht der Controller in Listing 1 eine Aktion namens Index() verfügbar. Die Ausgabe der Index()-Aktion wird 10 Sekunden lang zwischengespeichert.
Auflistung 1 – Controllers\HomeController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
[OutputCache(Duration=10, VaryByParam="none")]
public ActionResult Index()
{
return View();
}
}
}
In den Betaversionen von ASP.NET MVC funktioniert das Zwischenspeichern der Ausgabe für eine URL wie http://www.MySite.com/
nicht. Stattdessen müssen Sie eine URL wie http://www.MySite.com/Home/Index
eingeben.
In Listing 1 wird die Ausgabe der Index()-Aktion 10 Sekunden lang zwischengespeichert. Wenn Sie möchten, können Sie eine viel längere Cachedauer angeben. Wenn Sie beispielsweise die Ausgabe einer Controlleraktion für einen Tag zwischenspeichern möchten, können Sie eine Cachedauer von 86400 Sekunden (60 Sekunden * 60 Minuten * 24 Stunden) angeben.
Es gibt keine Garantie dafür, dass Inhalte für den von Ihnen angegebenen Zeitraum zwischengespeichert werden. Wenn die Arbeitsspeicherressourcen knapp werden, beginnt der Cache automatisch mit dem Entfernen von Inhalten.
Der Startcontroller in Listing 1 gibt die Indexansicht in Listing 2 zurück. Es gibt nichts Besonderes an dieser Ansicht. In der Indexansicht wird lediglich die aktuelle Uhrzeit angezeigt (siehe Abbildung 1).
Listing 2 – Views\Home\Index.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Index</title>
</head>
<body>
<div>
The current time is: <%= DateTime.Now.ToString("T") %>
</div>
</body>
</html>
Abbildung 1: Zwischengespeicherte Indexansicht
Wenn Sie die Index()-Aktion mehrmals aufrufen, indem Sie die URL /Home/Index in die Adressleiste Ihres Browsers eingeben und in Ihrem Browser wiederholt auf die Schaltfläche Aktualisieren/Neu laden klicken, ändert sich die in der Indexansicht angezeigte Zeit für 10 Sekunden nicht. Die gleiche Zeit wird angezeigt, da die Ansicht zwischengespeichert wird.
Es ist wichtig zu verstehen, dass die gleiche Ansicht für alle Benutzer, die Ihre Anwendung besuchen, zwischengespeichert wird. Jeder, der die Index()-Aktion aufruft, erhält dieselbe zwischengespeicherte Version der Indexansicht. Dies bedeutet, dass der Arbeitsaufwand, den der Webserver für die Bereitstellung der Indexansicht ausführen muss, erheblich reduziert wird.
Die Ansicht in Listing 2 macht etwas wirklich Einfaches. In der Ansicht wird nur die aktuelle Uhrzeit angezeigt. Sie können jedoch genauso einfach eine Ansicht zwischenspeichern, die eine Reihe von Datenbankdatensätzen anzeigt. In diesem Fall müsste der Satz von Datenbankdatensätzen nicht jedes Mal aus der Datenbank abgerufen werden, wenn die Controlleraktion aufgerufen wird, die die Ansicht zurückgibt. Zwischenspeichern kann den Arbeitsaufwand reduzieren, den sowohl der Webserver als auch der Datenbankserver ausführen müssen.
Verwenden Sie nicht die Seite <%@ OutputCache %> -Anweisung in einer MVC-Ansicht. Diese Richtlinie entblutet aus der Web Forms Welt und sollte nicht in einer ASP.NET MVC-Anwendung verwendet werden.
Wo Inhalt zwischengespeichert wird
Wenn Sie das [OutputCache]-Attribut verwenden, werden Inhalte standardmäßig an drei Speicherorten zwischengespeichert: dem Webserver, allen Proxyservern und dem Webbrowser. Sie können genau steuern, wo Inhalte zwischengespeichert werden, indem Sie die Location-Eigenschaft des [OutputCache]-Attributs ändern.
Sie können die Location-Eigenschaft auf einen der folgenden Werte festlegen:
· Jegliche
· Kunde
· Nachgeschaltete
· Server
· Nichts
· ServerAndClient
Standardmäßig weist die Location-Eigenschaft den Wert Any auf. Es gibt jedoch Situationen, in denen Sie nur im Browser oder nur auf dem Server zwischenspeichern möchten. Wenn Sie beispielsweise Informationen zwischenspeichern, die für jeden Benutzer personalisiert sind, sollten Sie die Informationen nicht auf dem Server zwischenspeichern. Wenn Sie unterschiedliche Informationen für verschiedene Benutzer anzeigen, sollten Sie die Informationen nur auf dem Client zwischenspeichern.
Beispielsweise macht der Controller in Listing 3 eine Aktion namens GetName() verfügbar, die den aktuellen Benutzernamen zurückgibt. Wenn Jack sich bei der Website anmeldet und die GetName()-Aktion aufruft, gibt die Aktion die Zeichenfolge "Hi Jack" zurück. Wenn sich Jill anschließend bei der Website anmeldet und die GetName()-Aktion aufruft, erhält sie auch die Zeichenfolge "Hi Jack". Die Zeichenfolge wird auf dem Webserver für alle Benutzer zwischengespeichert, nachdem Jack die Controlleraktion anfänglich aufgerufen hat.
Listing 3 – Controllers\BadUserController.cs
using System.Web.Mvc;
using System.Web.UI;
namespace MvcApplication1.Controllers
{
public class BadUserController : Controller
{
[OutputCache(Duration = 3600, VaryByParam = "none")]
public string GetName()
{
return "Hi " + User.Identity.Name;
}
}
}
Höchstwahrscheinlich funktioniert der Controller in Listing 3 nicht wie gewünscht. Sie möchten Jill nicht die Meldung "Hi Jack" anzeigen.
Sie sollten personalisierte Inhalte niemals im Servercache zwischenspeichern. Möglicherweise möchten Sie jedoch die personalisierten Inhalte im Browsercache zwischenspeichern, um die Leistung zu verbessern. Wenn Sie Inhalte im Browser zwischenspeichern und ein Benutzer die gleiche Controlleraktion mehrmals aufruft, kann der Inhalt aus dem Browsercache anstelle des Servers abgerufen werden.
Der geänderte Controller in Listing 4 speichert die Ausgabe der GetName()-Aktion zwischen. Der Inhalt wird jedoch nur im Browser und nicht auf dem Server zwischengespeichert. Wenn also mehrere Benutzer die GetName()-Methode aufrufen, erhält jede Person ihren eigenen Benutzernamen und nicht den Benutzernamen einer anderen Person.
Auflistung 4 – Controllers\UserController.cs
using System.Web.Mvc;
using System.Web.UI;
namespace MvcApplication1.Controllers
{
public class UserController : Controller
{
[OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)]
public string GetName()
{
return "Hi " + User.Identity.Name;
}
}
}
Beachten Sie, dass das [OutputCache]-Attribut in Listing 4 eine Location-Eigenschaft enthält, die auf den Wert OutputCacheLocation.Client festgelegt ist. Das [OutputCache]-Attribut enthält auch eine NoStore-Eigenschaft. Die NoStore-Eigenschaft wird verwendet, um Proxyserver und Browser darüber zu informieren, dass sie keine permanente Kopie des zwischengespeicherten Inhalts speichern sollen.
Variieren des Ausgabecaches
In einigen Situationen möchten Sie möglicherweise unterschiedliche zwischengespeicherte Versionen desselben Inhalts. Stellen Sie sich beispielsweise vor, Sie erstellen eine master-/Detailseite. Auf der Seite master wird eine Liste der Filmtitel angezeigt. Wenn Sie auf einen Titel klicken, erhalten Sie Details zum ausgewählten Film.
Wenn Sie die Detailseite zwischenspeichern, werden die Details für denselben Film angezeigt, unabhängig davon, auf welchen Film Sie klicken. Der erste vom ersten Benutzer ausgewählte Film wird allen zukünftigen Benutzern angezeigt.
Sie können dieses Problem beheben, indem Sie die VaryByParam-Eigenschaft des [OutputCache]-Attributs nutzen. Mit dieser Eigenschaft können Sie verschiedene zwischengespeicherte Versionen desselben Inhalts erstellen, wenn ein Formularparameter oder Abfragezeichenfolgenparameter variiert.
Beispielsweise macht der Controller in Listing 5 zwei Aktionen mit dem Namen Master() und Details() verfügbar. Die Master()-Aktion gibt eine Liste von Filmtiteln zurück, und die Detail()-Aktion gibt die Details für den ausgewählten Film zurück.
Auflistung 5 – Controllers\MoviesController.cs
using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
public class MoviesController : Controller
{
private MovieDataContext _dataContext;
public MoviesController()
{
_dataContext = new MovieDataContext();
}
[OutputCache(Duration=int.MaxValue, VaryByParam="none")]
public ActionResult Master()
{
ViewData.Model = (from m in _dataContext.Movies
select m).ToList();
return View();
}
[OutputCache(Duration = int.MaxValue, VaryByParam = "id")]
public ActionResult Details(int id)
{
ViewData.Model = _dataContext.Movies.SingleOrDefault(m => m.Id == id);
return View();
}
}
}
Die Master()-Aktion enthält eine VaryByParam-Eigenschaft mit dem Wert "none". Wenn die Master()-Aktion aufgerufen wird, wird dieselbe zwischengespeicherte Version der Masteransicht zurückgegeben. Alle Formularparameter oder Abfragezeichenfolgenparameter werden ignoriert (siehe Abbildung 2).
Abbildung 2: Ansicht "/Filme/Master"
Abbildung 3: Ansicht "/Filme/Details"
Die Details()-Aktion enthält eine VaryByParam-Eigenschaft mit dem Wert "Id". Wenn unterschiedliche Werte des Id-Parameters an die Controlleraktion übergeben werden, werden unterschiedliche zwischengespeicherte Versionen der Detailansicht generiert.
Es ist wichtig zu verstehen, dass die Verwendung der VaryByParam-Eigenschaft zu mehr Zwischenspeicherung und nicht weniger führt. Für jede version des Id-Parameters wird eine andere zwischengespeicherte Version der Detailansicht erstellt.
Sie können die VaryByParam-Eigenschaft auf die folgenden Werte festlegen:
* = Erstellen Sie eine andere zwischengespeicherte Version, wenn ein Formular- oder Abfragezeichenfolgenparameter variiert.
none = Nie andere zwischengespeicherte Versionen erstellen
Semikolonliste mit Parametern = Erstellen verschiedener zwischengespeicherter Versionen, wenn eine der Formular- oder Abfragezeichenfolgenparameter in der Liste variiert
Erstellen eines Cacheprofils
Alternativ zum Konfigurieren von Ausgabecacheeigenschaften durch Ändern der Eigenschaften des [OutputCache]-Attributs können Sie ein Cacheprofil in der Webkonfigurationsdatei (web.config) erstellen. Das Erstellen eines Cacheprofils in der Webkonfigurationsdatei bietet einige wichtige Vorteile.
Zunächst können Sie durch Konfigurieren der Ausgabezwischenspeicherung in der Webkonfigurationsdatei steuern, wie Controlleraktionen Inhalte an einem zentralen Speicherort zwischenspeichern. Sie können ein Cacheprofil erstellen und das Profil auf mehrere Controller oder Controlleraktionen anwenden.
Zweitens können Sie die Webkonfigurationsdatei ändern, ohne Ihre Anwendung neu zu kompilieren. Wenn Sie die Zwischenspeicherung für eine Anwendung deaktivieren müssen, die bereits in der Produktion bereitgestellt wurde, können Sie einfach die in der Webkonfigurationsdatei definierten Cacheprofile ändern. Alle Änderungen an der Webkonfigurationsdatei werden automatisch erkannt und angewendet.
Im Abschnitt zur Zwischenspeicherung> der Webkonfiguration in Listing 6 wird beispielsweise <ein Cacheprofil namens Cache1Hour definiert. Der <Zwischenspeicherungsabschnitt> muss im <Abschnitt system.web> einer Webkonfigurationsdatei angezeigt werden.
Auflistung 6 – Abschnitt zwischenspeichern für web.config
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Cache1Hour" duration="3600" varyByParam="none"/>
</outputCacheProfiles>
</outputCacheSettings>
</caching>
Der Controller in Listing 7 veranschaulicht, wie Sie das Cache1Hour-Profil mit dem [OutputCache]-Attribut auf eine Controlleraktion anwenden können.
Auflistung 7 – Controllers\ProfileController.cs
using System;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class ProfileController : Controller
{
[OutputCache(CacheProfile="Cache1Hour")]
public string Index()
{
return DateTime.Now.ToString("T");
}
}
}
Wenn Sie die Vom Controller in Listing 7 verfügbar gemachte Index()-Aktion aufrufen, wird die gleiche Zeit für eine Stunde zurückgegeben.
Zusammenfassung
Die Ausgabezwischenspeicherung bietet Ihnen eine sehr einfache Methode, um die Leistung Ihrer ASP.NET MVC-Anwendungen erheblich zu verbessern. In diesem Tutorial haben Sie gelernt, wie Sie das [OutputCache]-Attribut verwenden, um die Ausgabe von Controlleraktionen zwischenzuspeichern. Außerdem haben Sie gelernt, wie Sie Eigenschaften des [OutputCache]-Attributs ändern, z. B. die Eigenschaften Duration und VaryByParam, um zu ändern, wie Inhalte zwischengespeichert werden. Schließlich haben Sie gelernt, wie Sie Cacheprofile in der Webkonfigurationsdatei definieren.