Freigeben über


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

von Microsoft

Hier erfahren Sie, wie Sie dynamische und zwischengespeicherte Inhalte auf derselben Seite kombinieren. Nach der Cacheersetzung können Sie dynamische Inhalte wie Banneranzeigen oder Nachrichtenelemente auf einer zwischengespeicherten Seite anzeigen.

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 im Arbeitsspeicher für mehrere Benutzer zwischengespeichert werden.

Aber es gibt ein Problem. Was geschieht, wenn Sie dynamische Inhalte auf der Seite anzeigen müssen? Stellen Sie sich beispielsweise vor, Sie möchten eine Banneranzeige auf der Seite anzeigen. Sie möchten nicht, dass die Banneranzeige zwischengespeichert wird, damit jeder Benutzer die gleiche Werbung sieht. Auf diese Weise würden Sie kein Geld verdienen!

Glücklicherweise gibt es eine einfache Lösung. Sie können ein Feature des ASP.NET Frameworks mit dem Namen Post-Cache-Substitution nutzen. Nach der Cacheersetzung 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 Postcacheersetzung verwenden, wird eine Seite nur auf dem Server zwischengespeichert.

Verwenden der Post-Cache-Ersetzung

Die Verwendung der Post-Cache-Ersetzung 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 beispielsweise vor, Dass Sie verschiedene Nachrichtenelemente auf einer zwischengespeicherten Seite nach dem Zufallsprinzip anzeigen möchten. Die -Klasse in Listing 1 macht eine einzelne Methode mit dem Namen RenderNews() verfügbar, die zufällig ein Nachrichtenelement aus einer Liste mit drei Nachrichtenelementen zurückgibt.

Eintrag 1 – Models\News.cs

using System;
using System.Collections.Generic;
using System.Web;

namespace MvcApplication1.Models
{
    public class News
    {
        public static string RenderNews(HttpContext context)
        {
            var news = new List<string> 
                { 
                    "Gas prices go up!", 
                    "Life discovered on Mars!", 
                    "Moon disappears!" 
                };
            
            var rnd = new Random();
            return news[rnd.Next(news.Count)];
        }
    }
}

Um die Nachcacheersetzung 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="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<%@ Import Namespace="MvcApplication1.Models" %>
<!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>

    <% Response.WriteSubstitution(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 (es gibt keine Klammern). Stattdessen wird 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 – Controller\HomeController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        [OutputCache(Duration=60, VaryByParam="none")]
        public ActionResult Index()
        {
            return View();
        }
    }
}

Obwohl die Indexansicht zwischengespeichert ist, werden verschiedene zufällige Nachrichtenelemente angezeigt, wenn Sie die Seite Index anfordern. Wenn Sie die Seite Index anfordern, ändert sich die von der Seite angezeigte Zeit für 60 Sekunden nicht (siehe Abbildung 1). Die Tatsache, dass sich die Zeit nicht ändert, beweist, dass die Seite zwischengespeichert wird. Der von der WriteSubstitution()-Methode eingefügte Inhalt – das zufällige Nachrichtenelement – ändert sich jedoch mit jeder Anforderung.

Abbildung 1: Einfügen dynamischer Nachrichtenelemente in eine zwischengespeicherte Seite

clip_image002

Verwenden der Post-Cache-Ersetzung in Hilfsmethoden

Eine einfachere Möglichkeit, die Nachcacheersetzung zu nutzen, besteht darin, den Aufruf der WriteSubstitution()-Methode in einer benutzerdefinierten Hilfsmethode zu kapseln. Dieser Ansatz wird durch die Hilfsmethode in Listing 4 veranschaulicht.

Eintrag 4 – AdHelper.cs

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Helpers
{
    public static class AdHelper
    {
        public static void RenderBanner(this HtmlHelper helper)
        {
            var context = helper.ViewContext.HttpContext;
            context.Response.WriteSubstitution(RenderBannerInternal);
        }
        
        private static string RenderBannerInternal(HttpContext context)
        {
            var ads = new List<string> 
                { 
                    "/ads/banner1.gif", 
                    "/ads/banner2.gif", 
                    "/ads/banner3.gif" 
                };

            var rnd = new Random();
            var ad = ads[rnd.Next(ads.Count)];
            return String.Format("<img src='{0}' />", ad);
        }
    }
}

Listing 4 enthält eine statische Klasse, die 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 Banner-Werbebild aus einer Liste von drei Bannerwerbungsbildern zurück.

Die geänderte Indexansicht in Listing 5 veranschaulicht, wie Sie die Hilfsmethode RenderBanner() verwenden können. Beachten Sie, dass oben in der Ansicht eine zusätzliche <%@ Import %> -Direktive enthalten ist, um den MvcApplication1.Helpers-Namespace zu importieren. Wenn Sie den Import dieses Namespaces vernachlässigen, wird die RenderBanner()-Methode nicht als Methode in der Html-Eigenschaft angezeigt.

Listing 5 – Views\Home\Index.aspx (mit renderBanner()-Methode)

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<%@ Import Namespace="MvcApplication1.Models" %>
<%@ Import Namespace="MvcApplication1.Helpers" %>
<!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>

    <% Response.WriteSubstitution(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, die eine zufällige Banneranzeige anzeigt

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. Sie haben auch gelernt, wie Sie den Aufruf der WriteSubstitution()-Methode innerhalb 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 die Zwischenspeicherung nutzen, auch wenn Sie dynamische Inhalte auf Ihren Seiten anzeigen müssen.