Çıktı Önbelleğe Alma ile Performansı İyileştirme (C#)

Microsoft tarafından

Bu eğitimde, çıktı önbelleğe alma yararlanarak ASP.NET MVC web uygulamalarınızın performansını nasıl önemli ölçüde artırabileceğinizi öğrenirsiniz. Aynı içeriğin her bir yeni kullanıcı eylemi çağırdığında oluşturulmasıgerekmemesi için bir denetleyici eyleminden döndürülen sonucu nasıl önbelleğe aldığınızı öğrenirsiniz.

Bu öğreticinin amacı, çıktı önbelleğinden yararlanarak ASP.NET bir MVC uygulamasının performansını nasıl önemli ölçüde artırabileceğinizi açıklamaktır. Çıktı önbelleği, denetleyici eylemi yle döndürülen içeriği önbelleğe almalarını sağlar. Bu şekilde, aynı denetleyici eylemi çağrıldığı her seferinde aynı içeriğin oluşturulması gerekmez.

Örneğin, ASP.NET MVC uygulamanızın Dizin adlı bir görünümde veritabanı kayıtlarının listesini görüntülediğini düşünün. Normalde, bir kullanıcı Dizin görünümünü döndüren denetleyici eylemini her kez çağırınca, veritabanı kayıtları kümesi veritabanı sorgusu gerçekleştirerek veritabanından alınmalıdır.

Diğer taraftan, çıktı önbelleğinden yararlanırsanız, herhangi bir kullanıcı aynı denetleyici eylemini her çağırdığında bir veritabanı sorgusuyürütmeyi önleyebilirsiniz. Görünüm denetleyici eyleminden yeniden oluşturulacak şekilde önbellekten alınabilir. Önbelleğe alma, sunucuda gereksiz çalışma yapmaktan kaçınmanızı sağlar.

Çıkış Önbelleğe Alma Etkinleştirme

Tek bir denetleyici eylemine veya tüm denetleyici sınıfına bir [OutputCache] özniteliği ekleyerek çıktı önbelleğe alma özelliğini etkinleştirin. Örneğin, Listeleme 1'deki denetleyici, Index() adlı bir eylemi ortaya çıkarır. Dizin() eyleminin çıktısı 10 saniye önbelleğe alınır.

Listeleme 1 – Denetleyiciler\HomeController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        [OutputCache(Duration=10, VaryByParam="none")]
        public ActionResult Index()
        {
            return View();
        }
    }
}

ASP.NET MVC'nin Beta sürümlerinde, çıktı önbelleğe http://www.MySite.com/alma gibi bir URL için çalışmaz. Bunun yerine, gibi http://www.MySite.com/Home/Indexbir URL girmeniz gerekir.

Listeleme 1'de, Dizin() eyleminin çıktısı 10 saniye önbelleğe alınır. İsterseniz, çok daha uzun bir önbellek süresi belirtebilirsiniz. Örneğin, bir denetleyici eyleminin çıktısını bir gün için önbelleğe almak isterseniz, önbellek süresi 86400 saniye * (60 saniye 60 dakika * 24 saat) belirtebilirsiniz.

İçeriğin belirttiğiniz süre boyunca önbelleğe alınacağının garantisi yoktur. Bellek kaynakları azaldığında, önbellek içeriği otomatik olarak tahliye etmeye başlar.

Listeleme 1'deki Ev denetleyicisi, Listeleme 2'deki Dizin görünümünü döndürür. Bu manzaranın özel bir özelliği yok. Dizin görünümü yalnızca geçerli zamanı görüntüler (Bkz. Şekil 1).

Listeleme 2 – Görünümler\Ana Sayfa\Index.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<!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>
    
    The current time is: <%= DateTime.Now.ToString("T") %>
    
    
    </div>
</body>
</html>

Şekil 1 – Önbelleğe Alınmış Dizin görünümü

clip_image002

Tarayıcınızın adres çubuğuna URL /Home/Index'i girerek ve tarayıcınızdaki Yenile/Yeniden Yükle düğmesine tekrar tekrar basarak Index() eylemini birden çok kez çağırırsanız, Dizin görünümünde görüntülenen süre 10 saniye boyunca değişmez. Görünüm önbelleğe alındığından aynı süre görüntülenir.

Aynı görünümün uygulamanızı ziyaret eden herkes için önbelleğe alınmış olduğunu anlamak önemlidir. Index() eylemini çağıran herkes, Dizin görünümünün önbelleğe alınmış sürümünü alır. Bu, web sunucusunun Dizin görünümüne hizmet etmek için gerçekleştirmesi gereken çalışma miktarının önemli ölçüde azaldığı anlamına gelir.

Listeleme 2 görünümü gerçekten basit bir şey yapıyor olur. Görünüm yalnızca geçerli saati görüntüler. Ancak, veritabanı kayıtları kümesini görüntüleyen bir görünümü kolayca önbelleğe alabilirsiniz. Bu durumda, veritabanı kayıtları kümesiveritabanından her ve görünümü döndüren denetleyici eylem çağrıldı her zaman alınması gerekmez. Önbelleğe alma, hem web sunucunuzun hem de veritabanı sunucunuzun gerçekleştirmesi gereken çalışma miktarını azaltabilir.

MVC görünümünde <%@ OutputCache> % yönergesini kullanmayın. Bu yönerge, Web Formlar dünyasından kanayan ve ASP.NET bir MVC uygulamasında kullanılmamalıdır.

İçeriğin Önbelleğe Aldığı Yerler

Varsayılan olarak, [OutputCache] özniteliğini kullandığınızda, içerik üç konumda önbelleğe alınır: web sunucusu, tüm proxy sunucuları ve web tarayıcısı. [OutputCache] özniteliğinin Konum özelliğini değiştirerek içeriğin önbelleğe alınacağı yeri tam olarak denetleyebilirsiniz.

Konum özelliğini aşağıdaki değerlerden herhangi birine ayarlayabilirsiniz:

· Herhangi bir

· Istemci

· Aşağı akım

· Sunucu

· Hiçbiri

· ServerAndClient

Varsayılan olarak, Konum özelliği Any değerine sahiptir. Ancak, yalnızca tarayıcıda veya yalnızca sunucuda önbellek yapmak isteyebileceğiniz durumlar vardır. Örneğin, her kullanıcı için kişiselleştirilmiş bilgileri önbelleğe alıyorsanız, sunucudaki bilgileri önbelleğe almamalısınız. Farklı kullanıcılara farklı bilgiler görüntülüyorsanız, bilgileri yalnızca istemci üzerinde önbelleğe almanız gerekir.

Örneğin, Listeleme 3'teki denetleyici, geçerli kullanıcı adını döndüren GetName() adlı bir eylemi ortaya çıkarır. Jack web sitesine giriş yaparsa ve GetName() eylemini çağırırsa, eylem "Merhaba Jack" dizesini döndürür. Eğer, daha sonra, Jill web sitesine giriş ve GetName () eylem çağırır o zaman o da dize "Hi Jack" alırsınız. Jak başlangıçta denetleyici eylemini çağırdıktan sonra dize tüm kullanıcılar için web sunucusunda önbelleğe alınır.

Listeleme 3 – Denetleyiciler\BadUserController.cs

using System.Web.Mvc;
using System.Web.UI;

namespace MvcApplication1.Controllers
{
    public class BadUserController : Controller
    {
        [OutputCache(Duration = 3600, VaryByParam = "none")]
        public string GetName()
        {
            return "Hi " + User.Identity.Name;
        }
    }
}

Büyük olasılıkla, Listeleme 3'teki denetleyici istediğiniz şekilde çalışmaz. Jill'e "Merhaba Jack" mesajını göstermek istemezsin.

Sunucu önbelleğinde kişiselleştirilmiş içeriği asla önbelleğe almamalısınız. Ancak, performansı artırmak için tarayıcı önbelleğinde kişiselleştirilmiş içeriği önbelleğe almak isteyebilirsiniz. İçeriği tarayıcıda önbelleğe alırsanız ve bir kullanıcı aynı denetleyici eylemini birden çok kez çağırırsa, içerik sunucu yerine tarayıcı önbelleğinden alınabilir.

Listeleme 4'teki değiştirilmiş denetleyici GetName() eyleminin çıktısını önbelleğe alır. Ancak, içerik yalnızca tarayıcıda önbelleğe alınır ve sunucuda değil. Bu şekilde, birden çok kullanıcı GetName() yöntemini çağırdığında, her kişi başka bir kişinin kullanıcı adını değil, kendi kullanıcı adını alır.

Listeleme 4 – Denetleyiciler\UserController.cs

using System.Web.Mvc;
using System.Web.UI;

namespace MvcApplication1.Controllers
{
    public class UserController : Controller
    {
        [OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)]
        public string GetName()
        {
            return "Hi " + User.Identity.Name;
        }
    }
}

Listeleme 4'teki [OutputCache] özniteliğinin OutputCacheLocation.Client değerine ayarlanmış bir Konum özelliği içerdiğine dikkat edin. [OutputCache] özniteliği de bir NoStore özelliği içerir. NoStore özelliği, proxy sunucularına ve tarayıcıya önbelleğe alınmış içeriğin kalıcı bir kopyasını saklamamaları gerektiğini bildirmek için kullanılır.

Çıktı Önbelleğini Değiştirme

Bazı durumlarda, aynı içeriğin farklı önbelleğe alınmış sürümlerini isteyebilirsiniz. Örneğin, bir ana/ayrıntı sayfası oluşturduğunuzu düşünün. Ana sayfada film başlıklarının bir listesi görüntülenir. Bir başlığı tıklattığınızda, seçili filmin ayrıntılarını alırsınız.

Ayrıntılar sayfasını önbelleğe alırsak, hangi filme tıklarsanız tıklayın aynı filmin ayrıntıları görüntülenir. İlk kullanıcı tarafından seçilen ilk film gelecekteki tüm kullanıcılara görüntülenir.

[OutputÖnbellek] özniteliğinin VaryByParam özelliğinden yararlanarak bu sorunu çözebilirsiniz. Bu özellik, form parametresi veya sorgu dize parametresi değiştiğinde aynı içeriğin farklı önbelleğe alınmış sürümlerini oluşturmanıza olanak tanır.

Örneğin, Listeleme 5'teki denetleyici, Master() ve Details() adlı iki eylemi ortaya çıkarır. Master() eylemi film başlıklarının bir listesini döndürür ve Ayrıntılar() eylemi seçilen filmin ayrıntılarını döndürür.

Listeleme 5 – Denetleyiciler\MoviesController.cs

using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
    public class MoviesController : Controller
    {
        private MovieDataContext _dataContext;

        public MoviesController()
        {
            _dataContext = new MovieDataContext();
        }

        [OutputCache(Duration=int.MaxValue, VaryByParam="none")]
        public ActionResult Master()
        {
            ViewData.Model = (from m in _dataContext.Movies 
                              select m).ToList();
            return View();
        }

        [OutputCache(Duration = int.MaxValue, VaryByParam = "id")]
        public ActionResult Details(int id)
        {
            ViewData.Model = _dataContext.Movies.SingleOrDefault(m => m.Id == id);
            return View();
        }


    }
}

Master() eylemi "yok" değerine sahip bir VaryByParam özelliği içerir. Master() eylemi çağrıldığında, Master görünümünün aynı önbelleğe alınmış sürümü döndürülür. Form parametreleri veya sorgu dize parametreleri yoksayılır (Bkz. Şekil 2).

Şekil 2 – /Filmler/Ana görünüm

clip_image004

Şekil 3 – /Filmler/Ayrıntılar görünümü

clip_image006

Ayrıntılar() eylemi, "Id" değerine sahip bir VaryByParam özelliğini içerir. Id parametresinin farklı değerleri denetleyici eylemine aktarıldığında, Ayrıntılar görünümünün farklı önbelleğe alınmış sürümleri oluşturulur.

Bu VaryByParam özelliği kullanarak daha fazla önbelleğe alma ve daha az sonuçları anlamak önemlidir. Id parametresinin her farklı sürümü için Ayrıntılar görünümünün farklı bir önbelleğe alınmış sürümü oluşturulur.

VaryByParam özelliğini aşağıdaki değerlere ayarlayabilirsiniz:

*= Form veya sorgu dizesi parametresi değiştiğinde farklı önbelleğe alınmış bir sürüm oluşturun.

none = Asla farklı önbelleğe alınmış sürümler oluşturma

Parametrelerin semicolon listesi = Listedeki form veya sorgu dize parametrelerinden herhangi biri değiştiğinde farklı önbelleğe alınmış sürümler oluşturun

Önbellek Profili Oluşturma

[OutputCache] özniteliğinin özelliklerini değiştirerek çıktı önbelleği özelliklerini yapılandırmaya alternatif olarak, web yapılandırmasında (web.config) dosyada bir önbellek profili oluşturabilirsiniz. Web yapılandırma dosyasında önbellek profili oluşturmak birkaç önemli avantaj sunar.

İlk olarak, web yapılandırma dosyasında çıktı önbelleğe alma yapılandırarak, denetleyici eylemleri tek bir merkezi konumda içeriği nasıl önbelleğe denetleyebilirsiniz. Bir önbellek profili oluşturabilir ve profili birkaç denetleyiciye veya denetleyici eylemlere uygulayabilirsiniz.

İkinci olarak, uygulamanızı yeniden derlemeden web yapılandırma dosyasını değiştirebilirsiniz. Üretime zaten dağıtılmış bir uygulama için önbelleği devre dışı balmanız gerekiyorsa, web yapılandırma dosyasında tanımlanan önbellek profillerini değiştirebilirsiniz. Web yapılandırma dosyasındaki tüm değişiklikler otomatik olarak algılanır ve uygulanır.

Örneğin, Listeleme <> 6'daki önbelleğe alma web yapılandırması bölümü Cache1Hour adlı bir önbellek profili tanımlar. <Önbelleğe> alma bölümü, <bir> web yapılandırma dosyasının system.web bölümünde görünmelidir.

Listeleme 6 – web.config için önbelleğe alma bölümü

<caching>
<outputCacheSettings>
    <outputCacheProfiles>
        <add name="Cache1Hour" duration="3600" varyByParam="none"/>
    </outputCacheProfiles>
</outputCacheSettings>
</caching>

Listeleme 7'deki denetleyici, Önbellek 1Saat profilini [OutputCache] özniteliğiyle bir denetleyici eylemine nasıl uygulayabileceğinizi gösterir.

Listeleme 7 – Denetleyiciler\ProfileController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class ProfileController : Controller
    {
        [OutputCache(CacheProfile="Cache1Hour")]
        public string Index()
        {
            return DateTime.Now.ToString("T");
        }
    }
}

Listeleme 7'de denetleyici tarafından ortaya çıkarılan Index() eylemini çağırırsanız, aynı süre 1 saat boyunca döndürülür.

Özet

Çıkış önbelleğe alma, ASP.NET MVC uygulamalarınızın performansını önemli ölçüde artırmanın çok kolay bir yöntemini sağlar. Bu eğitimde, denetleyici eylemlerin çıktısını önbelleğe almak için [OutputCache] özniteliğini nasıl kullanacağınızı öğrendiniz. Ayrıca, içeriğin önbelleğe nasıl alındığını değiştirmek için Süre ve VaryByParam özellikleri gibi [OutputCache] özniteliğinin özelliklerini nasıl değiştireceğinizi de öğrendiniz. Son olarak, web yapılandırma dosyasındaki önbellek profillerini nasıl tanımlayabilirsiniz.