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
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
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.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla