Aracılığıyla paylaş


Önbelleğe Alınmış Bir Sayfaya Dinamik İçerik Ekleme (VB)

Microsoft tarafından

Dinamik ve önbelleğe alınmış içeriği aynı sayfada nasıl karıştıracağınızı öğrenin. Önbellek sonrası değiştirme, çıktı önbelleğe alınmış bir sayfada başlık reklamları veya haber öğeleri gibi dinamik içeriği görüntülemenizi sağlar.

Çıktı önbelleğinden yararlanarak, ASP.NET MVC uygulamasının performansını önemli ölçüde geliştirebilirsiniz. Sayfa her istenildiğinde sayfayı yeniden oluşturmak yerine, sayfa bir kez oluşturulabilir ve birden çok kullanıcı için bellekte önbelleğe alınabilir.

Ama bir sorun var. Sayfada dinamik içerik görüntülemeniz gerekiyorsa ne yapmanız gerekir? Örneğin, sayfada bir başlık reklamı görüntülemek istediğinizi düşünün. Her kullanıcının aynı reklamı görmesi için başlık reklamının önbelleğe alınmasını istemezsiniz. Bu şekilde para kazanamazsın!

Neyse ki, kolay bir çözüm var. önbellek sonrası değiştirme adlı ASP.NET çerçevesinin özelliklerinden yararlanabilirsiniz. Önbellek sonrası değiştirme, bellekte önbelleğe alınmış bir sayfadaki dinamik içeriği değiştirmenizi sağlar.

Normalde, OutputCache> özniteliğini kullanarak bir sayfayı <önbelleğe aldığınızda, sayfa hem sunucuda hem de istemcide (web tarayıcısı) önbelleğe alınır. Önbellek sonrası değiştirme kullandığınızda, bir sayfa yalnızca sunucuda önbelleğe alınır.

Önbellek Sonrası Değiştirme Kullanma

Önbellek sonrası değiştirmenin kullanılması için iki adım gerekir. İlk olarak, önbelleğe alınmış sayfada görüntülemek istediğiniz dinamik içeriği temsil eden bir dize döndüren bir yöntem tanımlamanız gerekir. Ardından, dinamik içeriği sayfaya eklemek için HttpResponse.WriteSubstitution() yöntemini çağırırsınız.

Örneğin, önbelleğe alınmış bir sayfada farklı haber öğelerini rastgele görüntülemek istediğinizi düşünün. Listing 1'deki sınıfı, üç haber öğesi listesinden rastgele bir haber öğesi döndüren RenderNews() adlı tek bir yöntemi kullanıma sunar.

Listeleme 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

Önbellek sonrası değiştirmeden yararlanmak için HttpResponse.WriteSubstitution() yöntemini çağırırsınız. WriteSubstitution() yöntemi, önbelleğe alınan sayfanın bir bölgesini dinamik içerikle değiştirmek için kodu ayarlar. WriteSubstitution() yöntemi, Liste 2'deki görünümde rastgele haber öğesini görüntülemek için kullanılır.

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

RenderNews yöntemi WriteSubstitution() yöntemine geçirilir. RenderNews yönteminin çağrılmadığını unutmayın. Bunun yerine, AddressOf işlecinin yardımıyla WriteSubstitution() yöntemine başvuru geçirilir.

Dizin görünümü önbelleğe alınır. Görünüm, Liste 3'teki denetleyici tarafından döndürülür. Index() eyleminin, Dizin görünümünün 60 saniye boyunca önbelleğe alınmasına neden olan bir <OutputCache> özniteliğiyle donatıldığına dikkat edin.

Listeleme 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

Dizin görünümü önbelleğe alınmış olsa da, Dizin sayfasını istediğinizde farklı rastgele haber öğeleri görüntülenir. Dizin sayfasını istediğinizde, sayfa tarafından görüntülenen süre 60 saniye boyunca değişmez (bkz. Şekil 1). Saatin değişmemesi, sayfanın önbelleğe alındığını kanıtlar. Ancak, WriteSubstitution() yöntemi (rastgele haber öğesi) tarafından eklenen içerik her istekle birlikte değişir.

Şekil 1 – Önbelleğe alınmış bir sayfaya dinamik haber öğeleri ekleme

clip_image002

Yardımcı Yöntemlerde Önbellek Sonrası Değiştirme Kullanma

Önbellek sonrası değiştirmeden yararlanmanın daha kolay bir yolu, özel bir yardımcı yöntemi içinde WriteSubstitution() yöntemine yapılan çağrıyı kapsüllemektir. Bu yaklaşım, Listeleme 4'teki yardımcı yöntem tarafından gösterilmiştir.

Listeleme 4 – Yardımcılar\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

Liste 4 iki yöntemi kullanıma sunan bir Visual Basic modülü içerir: RenderBanner() ve RenderBannerInternal(). RenderBanner() yöntemi gerçek yardımcı yöntemi temsil eder. Bu yöntem standart ASP.NET MVC HtmlHelper sınıfını genişletir, böylece diğer yardımcı yöntemler gibi bir görünümde Html.RenderBanner() çağırabilirsiniz.

RenderBanner() yöntemi, RenderBannerInternal() yöntemini WriteSubstitution() yöntemine geçirerek HttpResponse.WriteSubstitution() yöntemini çağırır.

RenderBannerInternal() yöntemi özel bir yöntemdir. Bu yöntem yardımcı yöntem olarak kullanıma sunulmaz. RenderBannerInternal() yöntemi, üç başlık tanıtım görüntüsü listesinden rastgele bir başlık tanıtım görüntüsü döndürür.

Liste 5'teki değiştirilmiş Dizin görünümü, RenderBanner() yardımcı yöntemini nasıl kullanabileceğinizi gösterir. MvcApplication1.Helpers ad alanını içeri aktarmak için görünümün en üstüne ek <bir %@ import %> yönergesi eklendiğini görebilirsiniz. Bu ad alanını içeri aktarmayı ihmal ederseniz, RenderBanner() yöntemi Html özelliğinde bir yöntem olarak görünmez.

Listeleme 5 – Views\Home\Index.aspx (RenderBanner() yöntemiyle)

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

Liste 5'teki görünüm tarafından işlenen sayfayı istediğinizde, her istekte farklı bir başlık tanıtımı görüntülenir (bkz. Şekil 2). Sayfa önbelleğe alınır, ancak başlık tanıtımı RenderBanner() yardımcı yöntemi tarafından dinamik olarak eklenir.

Şekil 2 – Rastgele başlık tanıtımı görüntüleyen Dizin görünümü

clip_image004

Özet

Bu öğreticide, önbelleğe alınmış bir sayfadaki içeriği nasıl dinamik olarak güncelleştirebileceğiniz açıklanmıştır. Önbelleğe alınmış bir sayfaya dinamik içerik eklemek için HttpResponse.WriteSubstitution() yöntemini kullanmayı öğrendinsiniz. Ayrıca bir HTML yardımcı yöntemi içinde WriteSubstitution() yöntemine yapılan çağrıyı kapsüllemeyi de öğrendiniz.

Mümkün olduğunda önbelleğe alma avantajından yararlanın; web uygulamalarınızın performansı üzerinde önemli bir etkisi olabilir. Bu öğreticide açıklandığı gibi, sayfalarınızda dinamik içerik görüntülemeniz gerektiğinde bile önbelleğe alma avantajından yararlanabilirsiniz.