Aracılığıyla paylaş


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

Microsoft tarafından

Bu öğreticide, çıktı önbelleğinden yararlanarak ASP.NET MVC web uygulamalarınızın performansını önemli ölçüde nasıl geliştirebileceğinizi öğreneceksiniz. Yeni bir kullanıcı eylemi her çağırışında aynı içeriğin oluşturulması gerekmemesi için bir denetleyici eyleminden döndürülen sonucu önbelleğe almayı öğrenirsiniz.

Bu öğreticinin amacı, çıktı önbelleğinden yararlanarak bir ASP.NET MVC uygulamasının performansını nasıl önemli ölçüde geliştirebileceğinizi açıklamaktır. Çıkış önbelleği, bir denetleyici eylemi tarafından döndürülen içeriği önbelleğe almanızı sağlar. Bu şekilde, aynı denetleyici eylemi her çağrıldığında 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, kullanıcının Dizin görünümünü döndüren denetleyici eylemini her çağırışında, veritabanı kayıtları kümesinin veritabanı sorgusu yürütülerek veritabanından alınması gerekir.

Öte yandan, çıkış önbelleğinden yararlanırsanız, herhangi bir kullanıcı aynı denetleyici eylemini her çağırışında veritabanı sorgusu yürütmekten kaçınabilirsiniz. Görünüm, denetleyici eyleminden yeniden oluşturmak yerine önbellekten alınabilir. Önbelleğe alma, sunucuda yedekli çalışma yapmaktan kaçınmanızı sağlar.

Çıktı Önbelleğe Almayı Etkinleştirme

Tek bir denetleyici eylemine veya denetleyici sınıfının tamamına [OutputCache] özniteliği ekleyerek çıktı önbelleğe almayı etkinleştirebilirsiniz. Örneğin, Liste 1'deki denetleyici Index() adlı bir eylemi kullanıma sunar. Index() eyleminin çıkışı 10 saniye boyunca önbelleğe alınır.

Listeleme 1 – Controllers\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, çıkış önbelleğe alma gibi http://www.MySite.com/bir URL için çalışmaz. Bunun yerine, gibi http://www.MySite.com/Home/Indexbir URL girmeniz gerekir.

Liste 1'de Index() eyleminin çıktısı 10 saniye boyunca ö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 boyunca önbelleğe almak istiyorsanız, 86400 saniyelik bir önbellek süresi (60 saniye * 60 dakika * 24 saat) belirtebilirsiniz.

İçeriğin belirttiğiniz süre boyunca önbelleğe alınacağı garanti değildir. Bellek kaynakları az olduğunda, önbellek içeriği otomatik olarak çıkarmaya başlar.

Liste 1'deki Giriş denetleyicisi, Liste 2'deki Dizin görünümünü döndürür. Bu görünümde özel bir şey yok. Dizin görünümü yalnızca geçerli saati görüntüler (bkz. Şekil 1).

Listeleme 2 – Views\Home\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 /Home/Index URL'sini girerek ve tarayıcınızdaki Yenile/Yeniden Yükle düğmesine art arda basarak Index() eylemini birden çok kez çağırırsanız, Dizin görünümü tarafından görüntülenen süre 10 saniye boyunca değişmez. Görünüm önbelleğe alındığından aynı saat görüntülenir.

Uygulamanızı ziyaret eden herkes için aynı görünümün önbelleğe alındığını 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ığını gösterir.

Liste 2'deki görünüm gerçekten basit bir şey yapıyor. Görünüm yalnızca geçerli saati görüntüler. Ancak, bir dizi veritabanı kaydını görüntüleyen bir görünümü de kolayca önbelleğe alabilirsiniz. Bu durumda, görünümü döndüren denetleyici eylemi her çağrıldığında veritabanı kayıt kümesinin veritabanından 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 Forms dünyadan kan akıyor ve ASP.NET bir MVC uygulamasında kullanılmamalıdır.

İçeriğin Önbelleğe Alındığı Yer

Varsayılan olarak, [OutputCache] özniteliğini kullandığınızda içerik üç konumda önbelleğe alınır: web sunucusu, herhangi bir ara sunucu ve web tarayıcısı. [OutputCache] özniteliğinin Location özelliğini değiştirerek içeriğin tam olarak nerede önbelleğe alınabileceğini denetleyebilirsiniz.

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

· Herhangi biri

· Istemci

· Aşağı akım

· Sunucu

· Hiçbiri

· ServerAndClient

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

Örneğin, Liste 3'teki denetleyici, geçerli kullanıcı adını döndüren GetName() adlı bir eylemi kullanıma sunar. Jack web sitesinde oturum açar ve GetName() eylemini çağırırsa, eylem "Merhaba Jack" dizesini döndürür. Daha sonra Jill web sitesinde oturum açar ve GetName() eylemini çağırırsa "Merhaba Jack" dizesini de alır. Dize, Jack denetleyici eylemini ilk kez çağırdıktan sonra tüm kullanıcılar için web sunucusunda önbelleğe alınır.

Listeleme 3 – Controllers\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, Liste 3'teki denetleyici istediğiniz gibi çalışmaz. Jill'e "Merhaba Jack" iletisini görüntülemek istemezsiniz.

Kişiselleştirilmiş içeriği hiçbir zaman sunucu önbelleğinde önbelleğe almamalısınız. Ancak performansı artırmak için kişiselleştirilmiş içeriği tarayıcı önbelleğinde ö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.

Liste 4'teki değiştirilen denetleyici GetName() eyleminin çıkışını önbelleğe alır. Ancak, içerik yalnızca tarayıcıda önbelleğe alınır ve sunucuda önbelleğe alınmaz. 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 – Controllers\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;
        }
    }
}

Liste 4'teki [OutputCache] özniteliğinin OutputCacheLocation.Client değerine ayarlanmış bir Location özelliği içerdiğine dikkat edin. [OutputCache] özniteliği bir NoStore özelliği de içerir. NoStore özelliği, ara sunuculara ve tarayıcıya önbelleğe alınan içeriğin kalıcı bir kopyasını depolamamaları gerektiğini bildirmek için kullanılır.

Çıkış Önbelleğini Değiştirerek

Bazı durumlarda, aynı içeriğin önbelleğe alınmış farklı 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 listesi görüntülenir. Bir başlığa tıkladığınızda, seçili filmin ayrıntılarını alırsınız.

Ayrıntılar sayfasını önbelleğe alırsanız, 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.

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

Örneğin, Listeleme 5'teki denetleyici Master() ve Details() adlı iki eylemi kullanıma sunar. Master() eylemi film başlıklarının listesini, Details() eylemi ise seçili filmin ayrıntılarını döndürür.

Listeleme 5 – Controllers\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, "none" değerine sahip bir VaryByParam özelliği içerir. Master() eylemi çağrıldığında, Ana görünümün önbelleğe alınmış sürümü döndürülür. Form parametreleri veya sorgu dizesi 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

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

VaryByParam özelliğini kullanmanın daha az değil daha fazla önbelleğe almayla sonuçlandığını anlamak önemlidir. Id parametresinin her farklı sürümü için Ayrıntılar görünümünün önbelleğe alınmış farklı bir sürümü oluşturulur.

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

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

none = Hiçbir zaman farklı önbelleğe alınmış sürümler oluşturma

Noktalı virgül parametre listesi = Listedeki form veya sorgu dizesi parametrelerinden herhangi biri değiştiğinde farklı önbelleğe alınmış sürümler oluşturma

Önbellek Profili Oluşturma

[OutputCache] özniteliğinin özelliklerini değiştirerek çıktı önbelleği özelliklerini yapılandırmaya alternatif olarak, web yapılandırması (web.config) dosyasında 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ğini yapılandırarak denetleyici eylemlerinin içeriği tek bir merkezi konumda nasıl önbelleğe alabileceğini denetleyebilirsiniz. Bir önbellek profili oluşturabilir ve profili çeşitli denetleyicilere veya denetleyici eylemlerine uygulayabilirsiniz.

İkincisi, uygulamanızı yeniden derlemeden web yapılandırma dosyasını değiştirebilirsiniz. Zaten üretime dağıtılmış bir uygulama için önbelleğe almayı devre dışı bırakmanız gerekiyorsa, web yapılandırma dosyasında tanımlanan önbellek profillerini değiştirmeniz yeterlidir. Web yapılandırma dosyasında yapılan 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.configiçin önbelleğe alma bölümü

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

Liste 7'deki denetleyici, [OutputCache] özniteliğine sahip bir denetleyici eylemine Cache1Hour profilini nasıl uygulayabileceğinizi gösterir.

Listeleme 7 – Controllers\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");
        }
    }
}

Liste 7'de denetleyici tarafından kullanıma sunulan Index() eylemini çağırırsanız, aynı süre 1 saat boyunca döndürülür.

Özet

Çıktı önbelleğe alma, ASP.NET MVC uygulamalarınızın performansını önemli ölçüde geliştirmeniz için çok kolay bir yöntem sağlar. Bu öğreticide, denetleyici eylemlerinin çıkışını önbelleğe almak için [OutputCache] özniteliğini kullanmayı öğrendiniz. Ayrıca içeriğin önbelleğe alınma şeklini değiştirmek için Duration ve VaryByParam özellikleri gibi [OutputCache] özniteliğinin özelliklerini değiştirmeyi de öğrendinsiniz. Son olarak, web yapılandırma dosyasında önbellek profillerini tanımlamayı öğrendin.