Melhorar o desempenho com o cache de saída (C#)Improving Performance with Output Caching (C#)

por Microsoftby Microsoft

Neste tutorial, você aprenderá como você pode melhorar drasticamente o desempenho dos aplicativos web ASP.NET MVC, aproveitando o cache de saída.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. Você aprenderá a armazenar em cache o resultado retornado de uma ação do controlador para que o mesmo conteúdo não precisa ser criado um novo usuário invoca a ação de cada vez.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.

O objetivo deste tutorial é explicar como você pode melhorar drasticamente o desempenho de um aplicativo ASP.NET MVC, aproveitando o cache de saída.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. O cache de saída permite armazenar em cache o conteúdo retornado por uma ação do controlador.The output cache enables you to cache the content returned by a controller action. Dessa forma, o mesmo conteúdo não precisa ser gerado a cada vez que a mesma ação de controlador é invocada.That way, the same content does not need to be generated each and every time the same controller action is invoked.

Por exemplo, imagine que seu aplicativo ASP.NET MVC exibe uma lista de registros de banco de dados em uma exibição nomeada de índice.Imagine, for example, that your ASP.NET MVC application displays a list of database records in a view named Index. Normalmente, cada vez que um usuário invoca a ação do controlador que retorna o modo de exibição de índice, o conjunto de registros do banco de dados deve ser recuperado do banco de dados executando uma consulta de banco de dados.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.

Se, por outro lado, você aproveitar o cache de saída, em seguida, você pode evitar a execução de uma consulta de banco de dados sempre que qualquer usuário invoca a mesma ação de controlador.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. O modo de exibição pode ser recuperado do cache em vez de serem gerados a partir de ação do controlador.The view can be retrieved from the cache instead of being regenerated from the controller action. Armazenamento em cache permite que você para evitar executar redundantes trabalhar no servidor.Caching enables you to avoid performing redundant work on the server.

Habilitação do cache de saídaEnabling Output Caching

Habilitar o cache de saída com a adição de um atributo [OutputCache] para uma ação de controlador individual ou uma classe de controlador inteiro.You enable output caching by adding an [OutputCache] attribute to either an individual controller action or an entire controller class. Por exemplo, o controlador na listagem 1 expõe uma ação chamada index ().For example, the controller in Listing 1 exposes an action named Index(). A saída da ação Index () é armazenado em cache por 10 segundos.The output of the Index() action is cached for 10 seconds.

Listagem 1 – Controllers\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();
        }
    }
}

Nas versões Beta do ASP.NET MVC, o cache de saída não funciona para uma URL como http://www.MySite.com/ .In the Beta versions of ASP.NET MVC, output caching does not work for a URL like http://www.MySite.com/. Em vez disso, você deve inserir uma URL como http://www.MySite.com/Home/Index .Instead, you must enter a URL like http://www.MySite.com/Home/Index.

Na listagem 1, a saída da ação Index () é armazenado em cache por 10 segundos.In Listing 1, the output of the Index() action is cached for 10 seconds. Se você preferir, você pode especificar uma duração de cache muito maior.If you prefer, you can specify a much longer cache duration. Por exemplo, se você quiser armazenar em cache a saída de uma ação do controlador para um dia, em seguida, você pode especificar uma duração de cache de 86400 segundos (60 segundos * 60 minutos * 24 horas).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).

Não há nenhuma garantia de que o conteúdo será armazenado em cache pelo período de tempo que você especificar.There is no guarantee that content will be cached for the amount of time that you specify. Quando recursos de memória se tornar baixo, o cache inicia automaticamente remover conteúdo.When memory resources become low, the cache starts evicting content automatically.

O controlador Home na listagem 1 retorna a exibição de índice na listagem 2.The Home controller in Listing 1 returns the Index view in Listing 2. Não há nada de especial sobre este modo de exibição.There is nothing special about this view. O modo de exibição de índice simplesmente exibe a hora atual (consulte a Figura 1).The Index view simply displays the current time (see Figure 1).

Listagem 2 – Views\Home\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>

Figura 1 – exibição de índice em cacheFigure 1 – Cached Index view

clip_image002

Se você invocar a ação Index () várias vezes inserindo o URL /Home/índice na barra de endereços do navegador e pressionar o botão de atualização/recarregamento em seu navegador repetidamente, em seguida, o horário exibido pelo modo de exibição de índice não será alterado para 10 segundos.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. O mesmo tempo é exibido porque o modo de exibição é armazenada em cache.The same time is displayed because the view is cached.

É importante entender que a mesma exibição é armazenada em cache para todas as pessoas que visitam seu aplicativo.It is important to understand that the same view is cached for everyone who visits your application. Qualquer pessoa que invoca a ação Index () receberá a mesma versão em cache do modo de exibição de índice.Anyone who invokes the Index() action will get the same cached version of the Index view. Isso significa que a quantidade de trabalho que o servidor web deve executar para servir o modo de exibição de índice é drasticamente reduzida.This means that the amount of work that the web server must perform to serve the Index view is dramatically reduced.

O modo de exibição na listagem 2 acontece estar fazendo algo muito simples.The view in Listing 2 happens to be doing something really simple. O modo de exibição exibe apenas a hora atual.The view just displays the current time. No entanto, você poderia apenas como cache facilmente uma exibição que exibe um conjunto de registros do banco de dados.However, you could just as easily cache a view that displays a set of database records. Nesse caso, o conjunto de registros do banco de dados não precisa ser recuperado do banco de dados cada vez que a ação de controlador que retorna o modo de exibição é invocada.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. Armazenamento em cache pode reduzir a quantidade de trabalho que devem executar o seu servidor web e o servidor de banco de dados.Caching can reduce the amount of work that both your web server and database server must perform.

Não use a página <% @ OutputCache %> diretiva em uma exibição do MVC.Don't use the page <%@ OutputCache %> directive in an MVC view. Essa diretiva sangramento ao longo do mundo de Web Forms e não deve ser usada em um aplicativo ASP.NET MVC.This directive is bleeding over from the Web Forms world and should not be used in an ASP.NET MVC application.

Qual conteúdo é armazenado em cacheWhere Content is Cached

Por padrão, quando você usa o atributo [OutputCache], o conteúdo é armazenado em três locais: o servidor web, todos os servidores proxy e o navegador da web.By default, when you use the [OutputCache] attribute, content is cached in three locations: the web server, any proxy servers, and the web browser. Você pode controlar exatamente qual conteúdo é armazenado em cache, modificando a propriedade de local do atributo [OutputCache].You can control exactly where content is cached by modifying the Location property of the [OutputCache] attribute.

Você pode definir a propriedade Location em qualquer um dos seguintes valores:You can set the Location property to any one of the following values:

· Qualquer· Any

· Cliente· Client

· Downstream· Downstream

· Servidor· Server

· None· None

· ServerAndClient· ServerAndClient

Por padrão, a propriedade Location tem o valor Any.By default, the Location property has the value Any. No entanto, há situações em que você talvez queira apenas no navegador ou apenas no servidor de cache.However, there are situations in which you might want to cache only on the browser or only on the server. Por exemplo, se você estiver armazenando em cache informações que são personalizadas para cada usuário, em seguida, você deve não armazenar em cache as informações no servidor.For example, if you are caching information that is personalized for each user then you should not cache the information on the server. Se você estiver exibindo informações diferentes para diferentes usuários, em seguida, você deve armazenar em cache as informações apenas no cliente.If you are displaying different information to different users then you should cache the information only on the client.

Por exemplo, o controlador na listagem 3 expõe uma ação chamada GetName () que retorna o nome de usuário atual.For example, the controller in Listing 3 exposes an action named GetName() that returns the current user name. Se Jack faz logon no site e invoca a ação GetName (), em seguida, a ação retorna a cadeia de caracteres "Hi Jack".If Jack logs into the website and invokes the GetName() action then the action returns the string "Hi Jack". Se, posteriormente, Jill faz logon no site e invoca a ação GetName (), em seguida, ela também obterá a cadeia de caracteres "Hi Jack".If, subsequently, Jill logs into the website and invokes the GetName() action then she also will get the string "Hi Jack". A cadeia de caracteres é armazenado em cache no servidor web para todos os usuários depois Jack inicialmente invoca a ação do controlador.The string is cached on the web server for all users after Jack initially invokes the controller action.

Listagem 3 – Controllers\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;
        }
    }
}

Provavelmente, o controlador na listagem 3 não funciona da maneira que desejar.Most likely, the controller in Listing 3 does not work the way that you want. Você não deseja exibir a mensagem "Olá Jack" a Jill.You don't want to display the message "Hi Jack" to Jill.

Você nunca deve armazenar em cache o conteúdo personalizado no cache do servidor.You should never cache personalized content in the server cache. No entanto, você talvez queira armazenar em cache o conteúdo personalizado no cache do navegador para melhorar o desempenho.However, you might want to cache the personalized content in the browser cache to improve performance. Se você armazenar em cache o conteúdo no navegador e um usuário chama a mesma ação de controlador várias vezes, o conteúdo pode ser recuperado do cache do navegador em vez do servidor.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.

O controlador de modificada na listagem 4 armazena em cache a saída da ação GetName ().The modified controller in Listing 4 caches the output of the GetName() action. No entanto, o conteúdo é armazenado em cache apenas no navegador e não no servidor.However, the content is cached only on the browser and not on the server. Dessa forma, quando vários usuários invocar o método GetName (), cada pessoa obtém seu próprio nome de usuário e nome de usuário não outra pessoa.That way, when multiple users invoke the GetName() method, each person gets their own user name and not another person's user name.

Listagem 4 – Controllers\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;
        }
    }
}

Observe que o atributo [OutputCache] na listagem 4 inclui uma propriedade local definida como o valor OutputCacheLocation.Client.Notice that the [OutputCache] attribute in Listing 4 includes a Location property set to the value OutputCacheLocation.Client. O atributo [OutputCache] também inclui uma propriedade NoStore.The [OutputCache] attribute also includes a NoStore property. A propriedade NoStore é usada para informar ao navegador e servidores proxy que eles não devem armazenar uma cópia permanente do conteúdo armazenado em cache.The NoStore property is used to inform proxy servers and browser that they should not store a permanent copy of the cached content.

Variar o Cache de saídaVarying the Output Cache

Em algumas situações, convém versões armazenadas em cache diferentes do mesmo conteúdo.In some situations, you might want different cached versions of the very same content. Por exemplo, imagine que você está criando uma página mestre/detalhes.Imagine, for example, that you are creating a master/detail page. A página mestra exibe uma lista de títulos de filmes.The master page displays a list of movie titles. Quando você clica em um título, você obtém detalhes para o filme selecionado.When you click a title, you get details for the selected movie.

Se você armazenar em cache a página de detalhes, em seguida, os detalhes do mesmo filme aparecerão não importa qual filme que você clicar.If you cache the details page, then the details for the same movie will be displayed no matter which movie you click. Primeiro filme selecionado pelo primeiro usuário será exibido para todos os usuários futuros.The first movie selected by the first user will be displayed to all future users.

Você pode corrigir esse problema, tirando proveito da propriedade VaryByParam do atributo [OutputCache].You can fix this problem by taking advantage of the VaryByParam property of the [OutputCache] attribute. Essa propriedade permite que você crie diferentes versões armazenadas em cache o conteúdo mesmo quando um parâmetro de formulário ou parâmetro de cadeia de caracteres de consulta varia.This property enables you to create different cached versions of the very same content when a form parameter or query string parameter varies.

Por exemplo, o controlador na listagem 5 expõe duas ações chamadas Master() e Details().For example, the controller in Listing 5 exposes two actions named Master() and Details(). A ação Master() retorna uma lista de títulos de filmes e a ação de Details() retorna os detalhes para o filme selecionado.The Master() action returns a list of movie titles and the Details() action returns the details for the selected movie.

Listagem 5 – Controllers\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();
        }


    }
}

A ação Master() inclui uma propriedade VaryByParam com o valor "none".The Master() action includes a VaryByParam property with the value "none". Quando exibe o Master() ação é invocada, a mesma versão em cache do mestre será retornado.When the Master() action is invoked, the same cached version of the Master view is returned. Quaisquer parâmetros de formulário ou cadeia de caracteres de consulta os parâmetros são ignorados (veja a Figura 2).Any form parameters or query string parameters are ignored (see Figure 2).

Figura 2 – o modo de exibição /Movies/MasterFigure 2 – The /Movies/Master view

clip_image004

Figura 3 – o modo de exibição de detalhes/Movies /Figure 3 – The /Movies/Details view

clip_image006

A ação de Details() inclui uma propriedade VaryByParam com o valor "Id".The Details() action includes a VaryByParam property with the value "Id". Quando valores diferentes do parâmetro Id são passados para a ação do controlador, diferentes versões armazenadas em cache do modo de exibição de detalhes são geradas.When different values of the Id parameter are passed to the controller action, different cached versions of the Details view are generated.

É importante entender que usando os resultados da propriedade VaryByParam na mais armazenamento em cache e não é menor.It is important to understand that using the VaryByParam property results in more caching and not less. Uma versão em cache diferente do modo de exibição de detalhes é criada para cada versão diferente do parâmetro Id.A different cached version of the Details view is created for each different version of the Id parameter.

Você pode definir a propriedade VaryByParam com os seguintes valores:You can set the VaryByParam property to the following values:

* = Crie uma versão em cache diferente sempre que varia de um parâmetro de cadeia de caracteres de consulta ou formulário.* = Create a different cached version whenever a form or query string parameter varies.

None = nunca criar diferentes versões armazenadas em cachenone = Never create different cached versions

Lista de ponto e vírgula dos parâmetros = criar diferentes versões em cache sempre que qualquer um dos parâmetros de cadeia de caracteres de formulário ou a consulta na lista varia de acordoSemicolon list of parameters = Create different cached versions whenever any of the form or query string parameters in the list varies

Criando um perfil de CacheCreating a Cache Profile

Como uma alternativa para configurar propriedades de cache de saída, modificando as propriedades do atributo [OutputCache], você pode criar um perfil de cache no arquivo de configuração (Web. config) da web.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. Criar um perfil de cache no arquivo de configuração da web oferece algumas vantagens importantes.Creating a cache profile in the web configuration file offers a couple of important advantages.

Primeiro, configurando o cache de saída no arquivo de configuração da web, você pode controlar como as ações do controlador armazenar em cache o conteúdo em um local central.First, by configuring output caching in the web configuration file, you can control how controller actions cache content in one central location. Você pode criar um perfil de cache e aplique o perfil para vários controladores ou ações do controlador.You can create one cache profile and apply the profile to several controllers or controller actions.

Em segundo lugar, você pode modificar o arquivo de configuração da web sem recompilar seu aplicativo.Second, you can modify the web configuration file without recompiling your application. Se você precisar desabilitar o cache para um aplicativo que já foi implantado para produção, em seguida, você pode simplesmente modificar os perfis de cache definidos no arquivo de configuração web.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. Todas as alterações ao arquivo de configuração da web serão detectadas automaticamente e aplicadas.Any changes to the web configuration file will be detected automatically and applied.

Por exemplo, o <caching> seção de configuração da web na listagem 6 define um perfil de cache chamado Cache1Hour.For example, the <caching> web configuration section in Listing 6 defines a cache profile named Cache1Hour. O <caching> seção deve ser exibido entre os <System. Web> seção de um arquivo de configuração da web.The <caching> section must appear within the <system.web> section of a web configuration file.

Listagem 6 – seção de cache para a Web. configListing 6 – Caching section for web.config

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

O controlador na listagem 7 ilustra como você pode aplicar o perfil Cache1Hour para uma ação do controlador com o atributo [OutputCache].The controller in Listing 7 illustrates how you can apply the Cache1Hour profile to a controller action with the [OutputCache] attribute.

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

Se você invocar a ação Index () exposta pelo controlador na listagem 7 será retornado o mesmo tempo por 1 hora.If you invoke the Index() action exposed by the controller in Listing 7 then the same time will be returned for 1 hour.

ResumoSummary

O cache de saída fornece um método muito fácil de melhorar drasticamente o desempenho de seus aplicativos ASP.NET MVC.Output caching provides you with a very easy method of dramatically improving the performance of your ASP.NET MVC applications. Neste tutorial, você aprendeu a usar o atributo [OutputCache] para armazenar em cache a saída das ações do controlador.In this tutorial, you learned how to use the [OutputCache] attribute to cache the output of controller actions. Você também aprendeu como modificar as propriedades do atributo [OutputCache] como as propriedades de duração e VaryByParam para modificar como conteúdo é armazenado em cache.You also learned how to modify properties of the [OutputCache] attribute such as the Duration and VaryByParam properties to modify how content gets cached. Por fim, você aprendeu como definir perfis de cache no arquivo de configuração da web.Finally, you learned how to define cache profiles in the web configuration file.