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
Erfahren Sie, wie Sie dynamische und zwischengespeicherte Inhalte auf derselben Seite kombinieren. Die Ersetzung nach dem Cache ermöglicht es Ihnen, dynamische Inhalte wie Banneranzeigen oder Nachrichtenelemente auf einer Seite anzuzeigen, die zwischengespeichert wurde.
Durch die Nutzung der Ausgabezwischenspeicherung können Sie die Leistung einer ASP.NET MVC-Anwendung erheblich verbessern. Anstatt eine Seite jedes Mal neu zu generieren, wenn die Seite angefordert wird, kann die Seite einmal generiert und für mehrere Benutzer im Arbeitsspeicher zwischengespeichert werden.
Aber es gibt ein Problem. Was geschieht, wenn Sie dynamische Inhalte auf der Seite anzeigen müssen? Angenommen, Sie möchten auf der Seite ein Banner anzeigen. Sie möchten nicht, dass die Banneranzeige zwischengespeichert wird, damit jeder Benutzer die gleiche Werbung sieht. Sie würden auf diese Weise kein Geld verdienen!
Glücklicherweise gibt es eine einfache Lösung. Sie können ein Feature des ASP.NET Frameworks nutzen, das als Ersetzung nach dem Cache bezeichnet wird. Durch die Ersetzung nach dem Cache können Sie dynamische Inhalte auf einer Seite ersetzen, die im Arbeitsspeicher zwischengespeichert wurde.
Wenn Sie eine Seite mithilfe des <OutputCache-Attributs> zwischenspeichern, wird die Seite normalerweise sowohl auf dem Server als auch auf dem Client (dem Webbrowser) zwischengespeichert. Wenn Sie die Ersetzung nach dem Cache verwenden, wird eine Seite nur auf dem Server zwischengespeichert.
Verwenden der Ersetzung nach dem Cache
Die Verwendung der Ersetzung nach dem Cache erfordert zwei Schritte. Zunächst müssen Sie eine Methode definieren, die eine Zeichenfolge zurückgibt, die den dynamischen Inhalt darstellt, den Sie auf der zwischengespeicherten Seite anzeigen möchten. Als Nächstes rufen Sie die HttpResponse.WriteSubstitution()-Methode auf, um den dynamischen Inhalt in die Seite einzufügen.
Stellen Sie sich z. B. vor, sie möchten zufällig verschiedene Nachrichtenelemente auf einer zwischengespeicherten Seite anzeigen. Die -Klasse in Listing 1 macht eine einzelne Methode namens RenderNews() verfügbar, die zufällig ein Nachrichtenelement aus einer Liste von drei Nachrichtenelementen zurückgibt.
Auflistung 1 – Models\News.vb
Public Class News
Shared Function RenderNews(ByVal context As HttpContext) As String
Dim newsItems As New List(Of String)
newsItems.Add("Gas prices go up!")
newsItems.Add("Life discovered on Mars!")
newsItems.Add("Moon disappears!")
Dim rnd As New Random()
Return newsItems(rnd.Next(newsItems.Count))
End Function
End Class
Um die Vorteile der Ersetzung nach dem Cache zu nutzen, rufen Sie die HttpResponse.WriteSubstitution()-Methode auf. Die WriteSubstitution()-Methode richtet den Code ein, um einen Bereich der zwischengespeicherten Seite durch dynamischen Inhalt zu ersetzen. Die WriteSubstitution()-Methode wird verwendet, um das zufällige Nachrichtenelement in der Ansicht in Listing 2 anzuzeigen.
Listing 2 – Views\Home\Index.aspx
<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="MvcApplication1" %>
<!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 id="Head1" runat="server">
<title>Index</title>
</head>
<body>
<div>
<% Response.WriteSubstitution(AddressOf News.RenderNews)%>
<hr />
The content of this page is output cached.
<%= DateTime.Now %>
</div>
</body>
</html>
Die RenderNews-Methode wird an die WriteSubstitution()-Methode übergeben. Beachten Sie, dass die RenderNews-Methode nicht aufgerufen wird. Stattdessen wird mithilfe des AddressOf-Operators ein Verweis auf die -Methode an WriteSubstitution() übergeben.
Die Indexansicht wird zwischengespeichert. Die Ansicht wird vom Controller in Listing 3 zurückgegeben. Beachten Sie, dass die Index()-Aktion mit einem <OutputCache-Attribut> versehen ist, das bewirkt, dass die Indexansicht 60 Sekunden lang zwischengespeichert wird.
Listing 3 – Controllers\HomeController.vb
<HandleError()> _
Public Class HomeController
Inherits System.Web.Mvc.Controller
<OutputCache(Duration:=60, VaryByParam:="none")> _
Function Index()
Return View()
End Function
End Class
Obwohl die Indexansicht zwischengespeichert ist, werden verschiedene zufällige Nachrichtenelemente angezeigt, wenn Sie die Indexseite anfordern. Wenn Sie die Indexseite anfordern, ändert sich die von der Seite angezeigte Zeit 60 Sekunden lang nicht (siehe Abbildung 1). Die Tatsache, dass sich die Zeit nicht ändert, beweist, dass die Seite zwischengespeichert wird. Der Inhalt, der von der WriteSubstitution()-Methode – dem zufälligen Nachrichtenelement – eingefügt wird, ändert sich jedoch mit jeder Anforderung.
Abbildung 1: Einfügen dynamischer Nachrichtenelemente in eine zwischengespeicherte Seite
Verwenden der Ersetzung nach dem Cache in Hilfsmethoden
Eine einfachere Möglichkeit, die Vorteile der Ersetzung nach dem Cache zu nutzen, besteht darin, den Aufruf der WriteSubstitution()-Methode innerhalb einer benutzerdefinierten Hilfsmethode zu kapseln. Dieser Ansatz wird durch die Hilfsmethode in Listing 4 veranschaulicht.
Auflistung 4 – Hilfsprogramme\AdHelper.vb
Imports System.Runtime.CompilerServices
Public Module AdHelper
<Extension()> _
Sub RenderBanner(ByVal helper As HtmlHelper)
Dim context = helper.ViewContext.HttpContext
context.Response.WriteSubstitution(AddressOf RenderBannerInternal)
End Sub
Private Function RenderBannerInternal(ByVal context As HttpContext) As String
Dim ads As New List(Of String)
ads.Add("/ads/banner1.gif")
ads.Add("/ads/banner2.gif")
ads.Add("/ads/banner3.gif")
Dim rnd As New Random()
Dim ad = ads(rnd.Next(ads.Count))
Return String.Format("<img src='{0}' />", ad)
End Function
End Module
Listing 4 enthält ein Visual Basic-Modul, das zwei Methoden verfügbar macht: RenderBanner() und RenderBannerInternal(). Die RenderBanner()-Methode stellt die eigentliche Hilfsmethode dar. Diese Methode erweitert die Standard-ASP.NET MVC HtmlHelper-Klasse, sodass Sie Html.RenderBanner() wie jede andere Hilfsmethode in einer Ansicht aufrufen können.
Die RenderBanner()-Methode ruft die HttpResponse.WriteSubstitution()-Methode auf, die die RenderBannerInternal()-Methode an die WriteSubstitution()-Methode übergibt.
Die RenderBannerInternal()-Methode ist eine private Methode. Diese Methode wird nicht als Hilfsmethode verfügbar gemacht. Die RenderBannerInternal()-Methode gibt zufällig ein Werbebannerbild aus einer Liste von drei Werbebannerbildern zurück.
Die geänderte Indexansicht in Listing 5 veranschaulicht, wie Sie die RenderBanner()-Hilfsmethode verwenden können. Beachten Sie, dass eine zusätzliche <%@ Import %> -Direktive oben in der Ansicht enthalten ist, um den MvcApplication1.Helpers-Namespace zu importieren. Wenn Sie diesen Namespace nicht importieren, wird die RenderBanner()-Methode nicht als Methode in der Html-Eigenschaft angezeigt.
Listing 5 – Views\Home\Index.aspx (mit RenderBanner()-Methode)
<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="MvcApplication1" %>
<!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 id="Head1" runat="server">
<title>Index</title>
</head>
<body>
<div>
<% Response.WriteSubstitution(AddressOf News.RenderNews)%>
<hr />
<% Html.RenderBanner()%>
<hr />
The content of this page is output cached.
<%= DateTime.Now %>
</div>
</body>
</html>
Wenn Sie die von der Ansicht in Listing 5 gerenderte Seite anfordern, wird bei jeder Anforderung eine andere Banneranzeige angezeigt (siehe Abbildung 2). Die Seite wird zwischengespeichert, aber die Bannerankündigung wird dynamisch von der RenderBanner()-Hilfsmethode eingefügt.
Abbildung 2 – Die Indexansicht mit einer zufälligen Banneranzeige
Zusammenfassung
In diesem Tutorial wurde erläutert, wie Sie Inhalte auf einer zwischengespeicherten Seite dynamisch aktualisieren können. Sie haben gelernt, wie Sie die HttpResponse.WriteSubstitution()-Methode verwenden, um das Einfügen dynamischer Inhalte in eine zwischengespeicherte Seite zu ermöglichen. Außerdem haben Sie gelernt, wie Sie den Aufruf der WriteSubstitution()-Methode in einer HTML-Hilfsmethode kapseln.
Nutzen Sie nach Möglichkeit die Zwischenspeicherung – dies kann sich dramatisch auf die Leistung Ihrer Webanwendungen auswirken. Wie in diesem Tutorial erläutert, können Sie das Zwischenspeichern auch dann nutzen, wenn Sie dynamische Inhalte auf Ihren Seiten anzeigen müssen.