Sdílet prostřednictvím


Přidání dynamického obsahu do stránky v mezipaměti (C#)

od Microsoftu

Naučte se kombinovat dynamický obsah a obsah uložený v mezipaměti na stejné stránce. Nahrazení mezipaměti po zobrazení dynamického obsahu, jako jsou bannerové reklamy nebo zprávy, na stránce, která byla výstupem uložena do mezipaměti.

Díky ukládání výstupu do mezipaměti můžete výrazně zvýšit výkon aplikace ASP.NET MVC. Místo opětovného vygenerování stránky pokaždé, když je stránka požadována, je možné stránku vygenerovat jednou a uložit ji do mezipaměti pro více uživatelů.

Ale je tu problém. Co když potřebujete na stránce zobrazit dynamický obsah? Představte si například, že chcete na stránce zobrazit bannerovou reklamu. Nechcete, aby byla bannerová reklama uložená v mezipaměti, aby se všem uživatelům zobrazila stejná reklama. Takhle bys nic nevydělal!

Naštěstí existuje jednoduché řešení. Můžete využít funkci rozhraní ASP.NET označovanou jako nahrazení po mezipaměti. Nahrazení po mezipaměti umožňuje nahradit dynamický obsah na stránce, která byla uložena do mezipaměti v paměti.

Při výstupu do mezipaměti stránky pomocí atributu [OutputCache] se stránka ukládá do mezipaměti na serveru i v klientovi (webovém prohlížeči). Pokud použijete nahrazení po mezipaměti, stránka se ukládá do mezipaměti pouze na serveru.

Použití nahrazení po mezipaměti

Použití nahrazení post-cache vyžaduje dva kroky. Nejprve je potřeba definovat metodu, která vrátí řetězec představující dynamický obsah, který chcete zobrazit na stránce uložené v mezipaměti. Dále zavoláte metodu HttpResponse.WriteSubstitution() pro vložení dynamického obsahu na stránku.

Představte si například, že chcete náhodně zobrazit různé zprávy na stránce v mezipaměti. Třída v seznamu 1 zveřejňuje jednu metodu s názvem RenderNews(), která náhodně vrací jednu položku zprávy ze seznamu tří zpráv.

Výpis 1 – Modely\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)];
        }
    }
}

Pokud chcete využít náhradu po mezipaměti, zavoláte metodu HttpResponse.WriteSubstitution(). Metoda WriteSubstitution() nastaví kód tak, aby nahradil oblast stránky uložené v mezipaměti dynamickým obsahem. Metoda WriteSubstitution() se používá k zobrazení náhodné zprávy v zobrazení v výpisu 2.

Výpis 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 je předána metodě WriteSubstitution(). Všimněte si, že metoda RenderNews není volána (neexistují žádné závorky). Místo toho se předá odkaz na metodu WriteSubstitution().

Zobrazení indexu je uložené v mezipaměti. Zobrazení vrátí kontroler ve výpisu 3. Všimněte si, že akce Index() je opatřena atributem [OutputCache], který způsobí, že zobrazení indexu se uloží do mezipaměti po dobu 60 sekund.

Výpis 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();
        }
    }
}

I když je zobrazení indexu uložené v mezipaměti, zobrazí se při žádosti o stránku Index různé náhodné zprávy. Když požádáte o stránku Index, čas zobrazený na stránce se po dobu 60 sekund nezmění (viz Obrázek 1). Skutečnost, že se čas nemění, dokazuje, že je stránka uložená v mezipaměti. Obsah vložený metodou WriteSubstitution() – náhodná položka zpráv – se však mění s každou žádostí .

Obrázek 1 – Vkládání dynamických položek zpráv na stránku uloženou v mezipaměti

clip_image002

Použití nahrazení po mezipaměti v pomocných metodách

Jednodušším způsobem, jak využít náhradu po mezipaměti, je zapouzdření volání metody WriteSubstitution() v rámci vlastní pomocné metody. Tento přístup znázorňuje pomocná metoda ve výpisu 4.

Výpis 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);
        }
    }
}

Výpis 4 obsahuje statickou třídu, která zveřejňuje dvě metody: RenderBanner() a RenderBannerInternal(). Metoda RenderBanner() představuje skutečnou pomocnou metodu. Tato metoda rozšiřuje standardní ASP.NET MVC HtmlHelper třídy tak, že můžete volat Html.RenderBanner() v zobrazení stejně jako jakékoli jiné pomocné metody.

Metoda RenderBanner() volá metodu HttpResponse.WriteSubstitution() a předává metodu RenderBannerInternal() metodě WriteSubstitution().

Metoda RenderBannerInternal() je privátní metoda. Tato metoda nebude vystavena jako pomocná metoda. Metoda RenderBannerInternal() náhodně vrátí jeden obrázek bannerové reklamy ze seznamu tří obrázků bannerové reklamy.

Upravené zobrazení indexu v výpisu 5 ukazuje, jak můžete použít metodu pomocné rutiny RenderBanner(). Všimněte si, že v horní části zobrazení je zahrnuta další <direktiva %@ Import %> pro import oboru názvů MvcApplication1.Helpers. Pokud tento obor názvů zanedbáte, pak se metoda RenderBanner() nezobrazí jako metoda ve vlastnosti Html.

Výpis 5 – Views\Home\Index.aspx (s metodou 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>

Když požádáte o stránku vykreslenou zobrazením v seznamu 5, zobrazí se s každou žádostí jiná bannerová reklama (viz obrázek 2). Stránka je uložena v mezipaměti, ale bannerový inzert je vložen dynamicky pomocí renderBanner() pomocné metody.

Obrázek 2 – Zobrazení indexu zobrazující náhodnou bannerovou reklamu

clip_image004

Souhrn

Tento kurz vysvětluje, jak můžete dynamicky aktualizovat obsah na stránce uložené v mezipaměti. Naučili jste se používat metodu HttpResponse.WriteSubstitution() k povolení vkládání dynamického obsahu na stránku v mezipaměti. Také jste se dozvěděli, jak zapouzdřit volání metody WriteSubstitution() v pomocné metodě HTML.

Kdykoli je to možné, využijte ukládání do mezipaměti – může to mít výrazný dopad na výkon vašich webových aplikací. Jak je vysvětleno v tomto kurzu, ukládání do mezipaměti můžete využít i v případě, že potřebujete na svých stránkách zobrazit dynamický obsah.