Dodawanie zawartości dynamicznej do buforowanej strony (VB)

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 reklamy banerów lub elementów wiadomości, na stronie, która została buforowana.

Korzystając z buforowania danych wyjściowych, można znacznie zwiększyć wydajność aplikacji MVC ASP.NET. Zamiast ponownego generowania strony 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ć baner na stronie. Nie chcesz buforować reklam baneru, aby każdy użytkownik widział tę samą reklamę. W ten sposób nie zarobisz żadnych pieniędzy!

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

Zwykle w przypadku danych wyjściowych 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życia podstawianie po pamięci podręcznej strona jest buforowana tylko na serwerze.

Używanie podstawianie po buforze

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 jedną metodę o nazwie RenderNews(), która losowo zwraca jeden element wiadomości z listy trzech elementów wiadomości.

Lista 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

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

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

Metoda RenderNews jest przekazywana do metody WriteSubstitution(). Zwróć uwagę, że metoda RenderNews nie jest wywoływana. Zamiast tego odwołanie do metody jest przekazywane do metody WriteSubstitution() za pomocą operatora AddressOf.

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.vb

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

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

End Class

Mimo że widok Indeks jest buforowany, podczas żądania strony Indeks są wyświetlane różne losowe elementy wiadomości. Gdy zażądasz strony Indeks, czas wyświetlany przez stronę nie zmienia się przez 60 sekund (zobacz Rysunek 1). Fakt, że czas nie zmienia się, dowodzi, ż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 korzystania z podstawień po pamięci podręcznej jest hermetyzowanie wywołania metody WriteSubstitution() w niestandardowej metodzie pomocniczej. To podejście jest ilustrowane przez metodę pomocnika w liście 4.

Lista 4 — Pomocnicy\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

Lista 4 zawiera moduł języka Visual Basic, który 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 na liście 5 ilustruje sposób użycia metody pomocnika RenderBanner(). Zwróć uwagę, że w górnej części widoku znajduje się dodatkowa <dyrektywa %@ Import %> w celu zaimportowania przestrzeni 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.

Lista 5 — Views\Home\Index.aspx (z metodą 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>

Gdy zażądasz strony renderowanej przez widok na liście 5, zostanie wyświetlony inny baner z każdym żądaniem (zobacz Rysunek 2). Strona jest buforowana, ale anons baneru jest wstrzykiwany dynamicznie przez metodę pomocnika RenderBanner().

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

clip_image004

Podsumowanie

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

Korzystaj z buforowania zawsze, 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 korzystać z buforowania nawet wtedy, gdy trzeba wyświetlić zawartość dynamiczną na stronach.