Udostępnij za pośrednictwem


Dodawanie zawartości dynamicznej do buforowanej strony (C#)

autor: Microsoft

Dowiedz się, jak mieszać zawartość dynamiczną i buforowana na tej samej stronie. Podstawianie po pamięci podręcznej umożliwia wyświetlanie zawartości dynamicznej, takiej jak anonse banerów lub elementów wiadomości, na stronie, która została buforowana.

Korzystając z buforowania danych wyjściowych, można znacznie poprawić wydajność aplikacji ASP.NET MVC. Zamiast ponownie wygenerować stronę za każdym razem, gdy jest żądana strona, można je wygenerować raz i buforować w pamięci dla wielu użytkowników.

Jest jednak problem. Co zrobić, jeśli chcesz wyświetlić zawartość dynamiczną na stronie? Załóżmy na przykład, że chcesz wyświetlić anons transparentu na stronie. Nie chcesz, aby reklama baneru została buforowana, aby każdy użytkownik widział tę samą anons. Nie zarobisz żadnych pieniędzy w ten sposób!

Na szczęście istnieje łatwe rozwiązanie. Możesz skorzystać z funkcji platformy ASP.NET nazywanej podstawianiem po pamięci podręcznej. Podstawianie po pamięci podręcznej umożliwia zastąpienie zawartości dynamicznej na stronie, która została buforowana w pamięci.

Zwykle podczas buforowania strony przy użyciu atrybutu [OutputCache] strona jest buforowana zarówno na serwerze, jak i na kliencie (w przeglądarce internetowej). W przypadku używania podstawianie po pamięci podręcznej strona jest buforowana tylko na serwerze.

Używanie podstawianie po pamięci podręcznej

Użycie podstawianie po pamięci podręcznej wymaga dwóch kroków. Najpierw należy zdefiniować metodę zwracającą ciąg reprezentujący zawartość dynamiczną, którą chcesz wyświetlić na stronie buforowanej. Następnie wywołasz metodę HttpResponse.WriteSubstitution(), aby wstrzyknąć zawartość dynamiczną do strony.

Załóżmy na przykład, że chcesz losowo wyświetlać różne elementy wiadomości na stronie buforowanej. Klasa w liście 1 uwidacznia pojedynczą metodę o nazwie RenderNews(), która losowo zwraca jeden element wiadomości z listy trzech elementów wiadomości.

Lista 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)];
        }
    }
}

Aby skorzystać z podstawień po pamięci podręcznej, należy wywołać metodę HttpResponse.WriteSubstitution(). Metoda WriteSubstitution() konfiguruje kod, aby zastąpić region strony buforowanej zawartością dynamiczną. Metoda WriteSubstitution() służy do wyświetlania losowego elementu wiadomości w widoku na liście 2.

Lista 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>

Metoda RenderNews jest przekazywana do metody WriteSubstitution(). Zwróć uwagę, że metoda RenderNews nie jest wywoływana (nie ma nawiasów). Zamiast tego odwołanie do metody jest przekazywane do metody WriteSubstitution().

Widok indeksu jest buforowany. Widok jest zwracany przez kontroler w liście 3. Zwróć uwagę, że akcja Index() jest ozdobiona atrybutem [OutputCache], który powoduje buforowanie widoku indeksu przez 60 sekund.

Lista 3 — Controllers\HomeController.cs

using System.Web.Mvc;

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

Mimo że widok indeksu jest buforowany, podczas żądania strony Indeks są wyświetlane różne losowe elementy wiadomości. Po zażądaniu strony Indeks czas wyświetlany przez stronę nie zmienia się przez 60 sekund (zobacz Rysunek 1). Fakt, że czas nie zmienia się, potwierdza, że strona jest buforowana. Jednak zawartość wstrzykiwana przez metodę WriteSubstitution() — losowy element wiadomości — zmienia się przy każdym żądaniu .

Rysunek 1. Wstrzykiwanie dynamicznych elementów wiadomości na stronie buforowanej

clip_image002

Używanie podstawianie po pamięci podręcznej w metodach pomocnika

Łatwiejszym sposobem wykorzystania podstawień po pamięci podręcznej jest hermetyzowanie wywołania metody WriteSubstitution() w ramach niestandardowej metody pomocniczej. To podejście jest ilustrowane przez metodę pomocnika w liście 4.

Lista 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);
        }
    }
}

Lista 4 zawiera klasę statyczną, która uwidacznia dwie metody: RenderBanner() i RenderBannerInternal(). Metoda RenderBanner() reprezentuje rzeczywistą metodę pomocnika. Ta metoda rozszerza standardową klasę ASP.NET MVC HtmlHelper, aby można było wywołać metodę Html.RenderBanner() w widoku tak samo jak w przypadku każdej innej metody pomocniczej.

Metoda RenderBanner() wywołuje metodę HttpResponse.WriteSubstitution() przekazującą metodę RenderBannerInternal() do metody WriteSubstitution().

Metoda RenderBannerInternal() jest metodą prywatną. Ta metoda nie zostanie uwidoczniona jako metoda pomocnika. Metoda RenderBannerInternal() losowo zwraca jeden obraz anonsu baneru z listy trzech obrazów anonsów banerów.

Zmodyfikowany widok indeksu w liście 5 ilustruje sposób użycia metody pomocnika RenderBanner(). Zwróć uwagę, że dodatkowa <dyrektywa %@ Import %> znajduje się w górnej części widoku, aby zaimportować przestrzeń nazw MvcApplication1.Helpers. Jeśli nie zaimportujesz tej przestrzeni nazw, metoda RenderBanner() nie będzie wyświetlana jako metoda we właściwości Html.

List 5 — Views\Home\Index.aspx (z metodą RenderBanner()

<%@ 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>

Gdy żądasz strony renderowanej przez widok w liście 5, zostanie wyświetlona inna reklama baneru z każdym żądaniem (patrz Rysunek 2). Strona jest buforowana, ale anons baneru jest wprowadzany dynamicznie przez metodę pomocnika RenderBanner().

Rysunek 2. Widok indeksu wyświetlający losową anonsowanie baneru

clip_image004

Podsumowanie

W tym samouczku wyjaśniono, jak dynamicznie aktualizować zawartość na stronie buforowanej. Przedstawiono sposób użycia metody HttpResponse.WriteSubstitution() w celu umożliwienia wstrzykiwania zawartości dynamicznej na stronie buforowanej. Przedstawiono również sposób hermetyzacji wywołania metody WriteSubstitution() w metodzie pomocnika HTML.

Korzystaj z buforowania, gdy jest to możliwe — może to mieć znaczący wpływ na wydajność aplikacji internetowych. Jak wyjaśniono w tym samouczku, możesz skorzystać z buforowania nawet wtedy, gdy trzeba wyświetlić zawartość dynamiczną na stronach.