Condividi tramite


Aggiunta di contenuto dinamico a una pagina memorizzata nella cache (VB)

da Microsoft

Informazioni su come combinare contenuto dinamico e memorizzato nella cache nella stessa pagina. La sostituzione post-cache consente di visualizzare contenuto dinamico, ad esempio annunci banner o notizie, all'interno di una pagina che è stata memorizzata nella cache.

Sfruttando la memorizzazione nella cache di output, è possibile migliorare notevolmente le prestazioni di un'applicazione MVC ASP.NET. Anziché rigenerare una pagina ogni e ogni volta che viene richiesta la pagina, la pagina può essere generata una volta e memorizzata nella cache in memoria per più utenti.

Ma c'è un problema. Cosa accade se è necessario visualizzare il contenuto dinamico nella pagina? Si supponga, ad esempio, di voler visualizzare un banner pubblicitario nella pagina. Non vuoi che l'annuncio banner venga memorizzato nella cache in modo che ogni utente visualizzi lo stesso annuncio. Non farete soldi in questo modo!

Fortunatamente, c'è una soluzione semplice. È possibile sfruttare una funzionalità del framework di ASP.NET denominato sostituzione post-cache. La sostituzione post-cache consente di sostituire il contenuto dinamico in una pagina memorizzata nella cache in memoria.

In genere, quando si esegue la cache di una pagina usando l'attributo <OutputCache> , la pagina viene memorizzata nella cache sia nel server che nel client (web browser). Quando si usa la sostituzione post-cache, una pagina viene memorizzata nella cache solo nel server.

Uso della sostituzione post-cache

L'uso della sostituzione post-cache richiede due passaggi. Prima di tutto, è necessario definire un metodo che restituisce una stringa che rappresenta il contenuto dinamico da visualizzare nella pagina memorizzata nella cache. Successivamente, si chiama il metodo HttpResponse.WriteSubstitution() per inserire il contenuto dinamico nella pagina.

Si supponga, ad esempio, di voler visualizzare in modo casuale diverse notizie in una pagina memorizzata nella cache. La classe in List 1 espone un singolo metodo, denominato RenderNews(), che restituisce in modo casuale un elemento di notizie da un elenco di tre elementi di notizie.

Elenco 1 - Modelli\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

Per sfruttare il vantaggio della sostituzione post-cache, chiamare il metodo HttpResponse.WriteSubstitution(). Il metodo WriteSubstitution() imposta il codice per sostituire un'area della pagina memorizzata nella cache con contenuto dinamico. Il metodo WriteSubstitution() viene usato per visualizzare l'elemento di notizie casuale nella visualizzazione nell'elenco 2.

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

Il metodo RenderNews viene passato al metodo WriteSubstitution(). Si noti che il metodo RenderNews non viene chiamato. Al contrario, un riferimento al metodo viene passato a WriteSubstitution() con l'aiuto dell'operatore AddressOf.

La visualizzazione Indice viene memorizzata nella cache. La visualizzazione viene restituita dal controller nell'elenco 3. Si noti che l'azione Index() viene decorata con un <attributo OutputCache> che causa la cache della visualizzazione Indice per 60 secondi.

Elenco 3 - Controller\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    <OutputCache(Duration:=60, VaryByParam:="none")> _
    Function Index()
        Return View()
    End Function

End Class

Anche se la visualizzazione Indice viene memorizzata nella cache, vengono visualizzati elementi di notizie casuali diversi quando si richiede la pagina Indice. Quando si richiede la pagina Indice, l'ora visualizzata dalla pagina non cambia per 60 secondi (vedere figura 1). Il fatto che l'ora non cambia dimostra che la pagina viene memorizzata nella cache. Tuttavia, il contenuto inserito dal metodo WriteSubstitution() – l'elemento notizie casuale – cambia con ogni richiesta .

Figura 1 : inserimento di elementi di notizie dinamici in una pagina memorizzata nella cache

clip_image002

Uso della sostituzione post-cache nei metodi helper

Un modo più semplice per sfruttare la sostituzione post-cache consiste nell'incapsulare la chiamata al metodo WriteSubstitution() all'interno di un metodo helper personalizzato. Questo approccio è illustrato dal metodo helper nell'elenco 4.

Elenco 4 - Helpers\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

L'elenco 4 contiene un modulo di Visual Basic che espone due metodi: RenderBanner() e RenderBannerInternal(). Il metodo RenderBanner() rappresenta il metodo helper effettivo. Questo metodo estende la classe standard ASP.NET MVC HtmlHelper in modo che sia possibile chiamare Html.RenderBanner() in una visualizzazione esattamente come qualsiasi altro metodo helper.

Il metodo RenderBanner() chiama il metodo HttpResponse.WriteSubstitution() passando il metodo RenderBannerInternal() al metodo WriteSubstitution().

Il metodo RenderBannerInternal() è un metodo privato. Questo metodo non verrà esposto come metodo helper. Il metodo RenderBannerInternal() restituisce in modo casuale un'immagine di annuncio banner da un elenco di tre immagini pubblicitarie banner.

La visualizzazione Indice modificato nell'elenco 5 illustra come usare il metodo helper RenderBanner(). Si noti che una direttiva %@ Import %> aggiuntiva <è inclusa nella parte superiore della visualizzazione per importare lo spazio dei nomi MvcApplication1.Helpers. Se non si ignora di importare questo spazio dei nomi, il metodo RenderBanner() non verrà visualizzato come metodo nella proprietà Html.

Elenco 5 : Views\Home\Index.aspx (con metodo RenderBanner()

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

Quando si richiede il rendering della pagina dalla visualizzazione nell'elenco 5, viene visualizzato un annuncio banner diverso con ogni richiesta (vedere la figura 2). La pagina viene memorizzata nella cache, ma l'annuncio banner viene inserito dinamicamente dal metodo helper RenderBanner().

Figura 2 : visualizzazione indice che visualizza un annuncio banner casuale

clip_image004

Riepilogo

Questa esercitazione illustra come aggiornare dinamicamente il contenuto in una pagina memorizzata nella cache. Si è appreso come usare il metodo HttpResponse.WriteSubstitution() per abilitare l'invio di contenuto dinamico in una pagina memorizzata nella cache. Si è anche appreso come incapsulare la chiamata al metodo WriteSubstitution() all'interno di un metodo helper HTML.

Sfruttare la memorizzazione nella cache ogni volta che possibile: può avere un impatto drammatico sulle prestazioni delle applicazioni Web. Come illustrato in questa esercitazione, è possibile sfruttare la memorizzazione nella cache anche quando è necessario visualizzare contenuto dinamico nelle pagine.