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

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.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)];
        }
    }
}

Ö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="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>

RenderNews yöntemi WriteSubstitution() yöntemine geçirilir. RenderNews yönteminin çağrılmadığını unutmayın (parantez yoktur). Bunun yerine, writeSubstitution() yöntemine bir 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 [OutputCache] özniteliğiyle donatıldığına dikkat edin.

Listeleme 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();
        }
    }
}

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 – 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);
        }
    }
}

Liste 4 iki yöntemi kullanıma sunan statik bir sınıf 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="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>

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.