Freigeben über


Hinzufügen von dynamischen Inhalten zu einer zwischengespeicherten Seite (VB)

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

clip_image002

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

clip_image004

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.