Çıktı Önbelleğe Alma ile Performansı İyileştirme (C#)Improving Performance with Output Caching (C#)

Microsoft tarafındanby Microsoft

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.In this tutorial, you learn how you can dramatically improve the performance of your ASP.NET MVC web applications by taking advantage of output caching. 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.You learn how to cache the result returned from a controller action so that the same content does not need to be created each and every time a new user invokes the action.

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.The goal of this tutorial is to explain how you can dramatically improve the performance of an ASP.NET MVC application by taking advantage of the output cache. Çıktı önbelleği, denetleyici eylemi yle döndürülen içeriği önbelleğe almalarını sağlar.The output cache enables you to cache the content returned by a controller action. Bu şekilde, aynı denetleyici eylemi çağrıldığı her seferinde aynı içeriğin oluşturulması gerekmez.That way, the same content does not need to be generated each and every time the same controller action is invoked.

Ö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.Imagine, for example, that your ASP.NET MVC application displays a list of database records in a view named Index. 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.Normally, each and every time that a user invokes the controller action that returns the Index view, the set of database records must be retrieved from the database by executing a database query.

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.If, on the other hand, you take advantage of the output cache then you can avoid executing a database query every time any user invokes the same controller action. Görünüm denetleyici eyleminden yeniden oluşturulacak şekilde önbellekten alınabilir.The view can be retrieved from the cache instead of being regenerated from the controller action. Önbelleğe alma, sunucuda gereksiz çalışma yapmaktan kaçınmanızı sağlar.Caching enables you to avoid performing redundant work on the server.

Çıkış Önbelleğe Alma EtkinleştirmeEnabling Output Caching

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.You enable output caching by adding an [OutputCache] attribute to either an individual controller action or an entire controller class. Örneğin, Listeleme 1'deki denetleyici, Index() adlı bir eylemi ortaya çıkarır.For example, the controller in Listing 1 exposes an action named Index(). Dizin() eyleminin çıktısı 10 saniye önbelleğe alınır.The output of the Index() action is cached for 10 seconds.

Listeleme 1 – Denetleyiciler\HomeController.csListing 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, çıktı önbelleğe http://www.MySite.com/alma gibi bir URL için çalışmaz.In the Beta versions of ASP.NET MVC, output caching does not work for a URL like http://www.MySite.com/. Bunun yerine, gibi http://www.MySite.com/Home/Indexbir URL girmeniz gerekir.Instead, you must enter a URL like http://www.MySite.com/Home/Index.

Listeleme 1'de, Dizin() eyleminin çıktısı 10 saniye önbelleğe alınır.In Listing 1, the output of the Index() action is cached for 10 seconds. İsterseniz, çok daha uzun bir önbellek süresi belirtebilirsiniz.If you prefer, you can specify a much longer cache duration. Ö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.For example, if you want to cache the output of a controller action for one day then you can specify a cache duration of 86400 seconds (60 seconds * 60 minutes * 24 hours).

İçeriğin belirttiğiniz süre boyunca önbelleğe alınacağının garantisi yoktur.There is no guarantee that content will be cached for the amount of time that you specify. Bellek kaynakları azaldığında, önbellek içeriği otomatik olarak tahliye etmeye başlar.When memory resources become low, the cache starts evicting content automatically.

Listeleme 1'deki Ev denetleyicisi, Listeleme 2'deki Dizin görünümünü döndürür.The Home controller in Listing 1 returns the Index view in Listing 2. Bu manzaranın özel bir özelliği yok.There is nothing special about this view. Dizin görünümü yalnızca geçerli zamanı görüntüler (Bkz. Şekil 1).The Index view simply displays the current time (see Figure 1).

Listeleme 2 – Görünümler\Ana Sayfa\Index.aspxListing 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üFigure 1 – Cached Index view

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.If you invoke the Index() action multiple times by entering the URL /Home/Index in the address bar of your browser and hitting the Refresh/Reload button in your browser repeatedly, then the time displayed by the Index view won't change for 10 seconds. Görünüm önbelleğe alındığından aynı süre görüntülenir.The same time is displayed because the view is cached.

Aynı görünümün uygulamanızı ziyaret eden herkes için önbelleğe alınmış olduğunu anlamak önemlidir.It is important to understand that the same view is cached for everyone who visits your application. Index() eylemini çağıran herkes, Dizin görünümünün önbelleğe alınmış sürümünü alır.Anyone who invokes the Index() action will get the same cached version of the Index view. 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.This means that the amount of work that the web server must perform to serve the Index view is dramatically reduced.

Listeleme 2 görünümü gerçekten basit bir şey yapıyor olur.The view in Listing 2 happens to be doing something really simple. Görünüm yalnızca geçerli saati görüntüler.The view just displays the current time. Ancak, veritabanı kayıtları kümesini görüntüleyen bir görünümü kolayca önbelleğe alabilirsiniz.However, you could just as easily cache a view that displays a set of database records. 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.In that case, the set of database records would not need to be retrieved from the database each and every time the controller action that returns the view is invoked. Önbelleğe alma, hem web sunucunuzun hem de veritabanı sunucunuzun gerçekleştirmesi gereken çalışma miktarını azaltabilir.Caching can reduce the amount of work that both your web server and database server must perform.

MVC görünümünde <%@ OutputCache> % yönergesini kullanmayın.Don't use the page <%@ OutputCache %> directive in an MVC view. Bu yönerge, Web Formlar dünyasından kanayan ve ASP.NET bir MVC uygulamasında kullanılmamalıdır.This directive is bleeding over from the Web Forms world and should not be used in an ASP.NET MVC application.

İçeriğin Önbelleğe Aldığı YerlerWhere Content is Cached

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ı.By default, when you use the [OutputCache] attribute, content is cached in three locations: the web server, any proxy servers, and the web browser. [OutputCache] özniteliğinin Konum özelliğini değiştirerek içeriğin önbelleğe alınacağı yeri tam olarak denetleyebilirsiniz.You can control exactly where content is cached by modifying the Location property of the [OutputCache] attribute.

Konum özelliğini aşağıdaki değerlerden herhangi birine ayarlayabilirsiniz:You can set the Location property to any one of the following values:

· Herhangi bir· Any

· Istemci· Client

· Aşağı akım· Downstream

· Sunucu· Server

· Hiçbiri· None

· ServerAndClient· ServerAndClient

Varsayılan olarak, Konum özelliği Any değerine sahiptir.By default, the Location property has the value Any. Ancak, yalnızca tarayıcıda veya yalnızca sunucuda önbellek yapmak isteyebileceğiniz durumlar vardır.However, there are situations in which you might want to cache only on the browser or only on the server. Örneğin, her kullanıcı için kişiselleştirilmiş bilgileri önbelleğe alıyorsanız, sunucudaki bilgileri önbelleğe almamalısınız.For example, if you are caching information that is personalized for each user then you should not cache the information on the server. Farklı kullanıcılara farklı bilgiler görüntülüyorsanız, bilgileri yalnızca istemci üzerinde önbelleğe almanız gerekir.If you are displaying different information to different users then you should cache the information only on the client.

Örneğin, Listeleme 3'teki denetleyici, geçerli kullanıcı adını döndüren GetName() adlı bir eylemi ortaya çıkarır.For example, the controller in Listing 3 exposes an action named GetName() that returns the current user name. Jack web sitesine giriş yaparsa ve GetName() eylemini çağırırsa, eylem "Merhaba Jack" dizesini döndürür.If Jack logs into the website and invokes the GetName() action then the action returns the string "Hi Jack". 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.If, subsequently, Jill logs into the website and invokes the GetName() action then she also will get the string "Hi Jack". 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.The string is cached on the web server for all users after Jack initially invokes the controller action.

Listeleme 3 – Denetleyiciler\BadUserController.csListing 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, Listeleme 3'teki denetleyici istediğiniz şekilde çalışmaz.Most likely, the controller in Listing 3 does not work the way that you want. Jill'e "Merhaba Jack" mesajını göstermek istemezsin.You don't want to display the message "Hi Jack" to Jill.

Sunucu önbelleğinde kişiselleştirilmiş içeriği asla önbelleğe almamalısınız.You should never cache personalized content in the server cache. Ancak, performansı artırmak için tarayıcı önbelleğinde kişiselleştirilmiş içeriği önbelleğe almak isteyebilirsiniz.However, you might want to cache the personalized content in the browser cache to improve performance. İç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.If you cache content in the browser, and a user invokes the same controller action multiple times, then the content can be retrieved from the browser cache instead of the server.

Listeleme 4'teki değiştirilmiş denetleyici GetName() eyleminin çıktısını önbelleğe alır.The modified controller in Listing 4 caches the output of the GetName() action. Ancak, içerik yalnızca tarayıcıda önbelleğe alınır ve sunucuda değil.However, the content is cached only on the browser and not on the server. 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.That way, when multiple users invoke the GetName() method, each person gets their own user name and not another person's user name.

Listeleme 4 – Denetleyiciler\UserController.csListing 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;
        }
    }
}

Listeleme 4'teki [OutputCache] özniteliğinin OutputCacheLocation.Client değerine ayarlanmış bir Konum özelliği içerdiğine dikkat edin.Notice that the [OutputCache] attribute in Listing 4 includes a Location property set to the value OutputCacheLocation.Client. [OutputCache] özniteliği de bir NoStore özelliği içerir.The [OutputCache] attribute also includes a NoStore property. 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.The NoStore property is used to inform proxy servers and browser that they should not store a permanent copy of the cached content.

Çıktı Önbelleğini DeğiştirmeVarying the Output Cache

Bazı durumlarda, aynı içeriğin farklı önbelleğe alınmış sürümlerini isteyebilirsiniz.In some situations, you might want different cached versions of the very same content. Örneğin, bir ana/ayrıntı sayfası oluşturduğunuzu düşünün.Imagine, for example, that you are creating a master/detail page. Ana sayfada film başlıklarının bir listesi görüntülenir.The master page displays a list of movie titles. Bir başlığı tıklattığınızda, seçili filmin ayrıntılarını alırsınız.When you click a title, you get details for the selected movie.

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.If you cache the details page, then the details for the same movie will be displayed no matter which movie you click. İlk kullanıcı tarafından seçilen ilk film gelecekteki tüm kullanıcılara görüntülenir.The first movie selected by the first user will be displayed to all future users.

[OutputÖnbellek] özniteliğinin VaryByParam özelliğinden yararlanarak bu sorunu çözebilirsiniz.You can fix this problem by taking advantage of the VaryByParam property of the [OutputCache] attribute. 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.This property enables you to create different cached versions of the very same content when a form parameter or query string parameter varies.

Örneğin, Listeleme 5'teki denetleyici, Master() ve Details() adlı iki eylemi ortaya çıkarır.For example, the controller in Listing 5 exposes two actions named Master() and Details(). 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.The Master() action returns a list of movie titles and the Details() action returns the details for the selected movie.

Listeleme 5 – Denetleyiciler\MoviesController.csListing 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 "yok" değerine sahip bir VaryByParam özelliği içerir.The Master() action includes a VaryByParam property with the value "none". 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.When the Master() action is invoked, the same cached version of the Master view is returned. Form parametreleri veya sorgu dize parametreleri yoksayılır (Bkz. Şekil 2).Any form parameters or query string parameters are ignored (see Figure 2).

Şekil 2 – /Filmler/Ana görünümFigure 2 – The /Movies/Master view

clip_image004

Şekil 3 – /Filmler/Ayrıntılar görünümüFigure 3 – The /Movies/Details view

clip_image006

Ayrıntılar() eylemi, "Id" değerine sahip bir VaryByParam özelliğini içerir.The Details() action includes a VaryByParam property with the value "Id". 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.When different values of the Id parameter are passed to the controller action, different cached versions of the Details view are generated.

Bu VaryByParam özelliği kullanarak daha fazla önbelleğe alma ve daha az sonuçları anlamak önemlidir.It is important to understand that using the VaryByParam property results in more caching and not less. 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.A different cached version of the Details view is created for each different version of the Id parameter.

VaryByParam özelliğini aşağıdaki değerlere ayarlayabilirsiniz:You can set the VaryByParam property to the following values:

*= Form veya sorgu dizesi parametresi değiştiğinde farklı önbelleğe alınmış bir sürüm oluşturun.* = Create a different cached version whenever a form or query string parameter varies.

none = Asla farklı önbelleğe alınmış sürümler oluşturmanone = Never create different cached versions

Parametrelerin semicolon listesi = Listedeki form veya sorgu dize parametrelerinden herhangi biri değiştiğinde farklı önbelleğe alınmış sürümler oluşturunSemicolon list of parameters = Create different cached versions whenever any of the form or query string parameters in the list varies

Önbellek Profili OluşturmaCreating a Cache Profile

[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.As an alternative to configuring output cache properties by modifying properties of the [OutputCache] attribute, you can create a cache profile in the web configuration (web.config) file. Web yapılandırma dosyasında önbellek profili oluşturmak birkaç önemli avantaj sunar.Creating a cache profile in the web configuration file offers a couple of important advantages.

İ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.First, by configuring output caching in the web configuration file, you can control how controller actions cache content in one central location. Bir önbellek profili oluşturabilir ve profili birkaç denetleyiciye veya denetleyici eylemlere uygulayabilirsiniz.You can create one cache profile and apply the profile to several controllers or controller actions.

İkinci olarak, uygulamanızı yeniden derlemeden web yapılandırma dosyasını değiştirebilirsiniz.Second, you can modify the web configuration file without recompiling your application. Ü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.If you need to disable caching for an application that has already been deployed to production, then you can simply modify the cache profiles defined in the web configuration file. Web yapılandırma dosyasındaki tüm değişiklikler otomatik olarak algılanır ve uygulanır.Any changes to the web configuration file will be detected automatically and applied.

Örneğin, Listeleme <> 6'daki önbelleğe alma web yapılandırması bölümü Cache1Hour adlı bir önbellek profili tanımlar.For example, the <caching> web configuration section in Listing 6 defines a cache profile named Cache1Hour. <Önbelleğe> alma bölümü, <bir> web yapılandırma dosyasının system.web bölümünde görünmelidir.The <caching> section must appear within the <system.web> section of a web configuration file.

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

<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.The controller in Listing 7 illustrates how you can apply the Cache1Hour profile to a controller action with the [OutputCache] attribute.

Listeleme 7 – Denetleyiciler\ProfileController.csListing 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");
        }
    }
}

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.If you invoke the Index() action exposed by the controller in Listing 7 then the same time will be returned for 1 hour.

ÖzetSummary

Çı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.Output caching provides you with a very easy method of dramatically improving the performance of your ASP.NET MVC applications. Bu eğitimde, denetleyici eylemlerin çıktısını önbelleğe almak için [OutputCache] özniteliğini nasıl kullanacağınızı öğrendiniz.In this tutorial, you learned how to use the [OutputCache] attribute to cache the output of controller actions. 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.You also learned how to modify properties of the [OutputCache] attribute such as the Duration and VaryByParam properties to modify how content gets cached. Son olarak, web yapılandırma dosyasındaki önbellek profillerini nasıl tanımlayabilirsiniz.Finally, you learned how to define cache profiles in the web configuration file.