Cache de Partes de uma Página ASP.NET

Às vezes não é prático fazer o cache de uma página inteira, porque partes da página podem precisar ser alteradas em cada solicitação.Nesses casos, você pode fazer o cache apenas de uma parte de uma página.Há duas opções para fazer isso: cache de controle e a substituição pós-cache.

No cache de controle, também conhecido como cache de fragmento, você pode fazer cache de partes da saída da página, criando controles de usuário para conter o conteúdo em cache e marcando os controles de usuário como armazenáveis em cache (cacheable).Isso permite que um conteúdo específico em uma página seja armazenado em cache, enquanto a página inteira é recriada a cada vez.Por exemplo, se você criar uma página que exibe conteúdo amplamente dinâmico, como informações sobre ações, mas também possui seções que são estáticas, como resumos semanais, você pode criar as seções estáticas em controles de usuário e configurar os controles de usuário para serem armazenados em cache.

A substituição pós-cache é o oposto.A página é armazenada em cache, mas fragmentos dentro da página são dinâmicos e portanto não devem ser armazenados em cache.Por exemplo, se você criar uma página que é totalmente estática para definir períodos de tempo, como uma página de artigos de notícias, pode definir a página inteira para ser armazenada em cache.Se você adicionou faixas giratórias de anúncio à página em cache, não deve haver alterações entre solicitações de página.Entretanto, com a substituição pós-cache, a página pode ser armazenada em cache, mas você pode marcar partes específicas como não armazenáveis em cache (non-cacheable).No exemplo, você deve marcar as faixas de anúncio como não armazenáveis em cache.Elas poderiam ser dinamicamente criadas para cada solicitação da página e adicionadas à saída da página em cache.Para obter mais informações sobre substituição após cache, consulte Atualizar dinamicamente porções de uma página em cache.

Cache de Controle

Criar controles de usuário para armazenar conteúdo em cache permite-lhe separar partes de uma página que requeiram tempo de processador valioso para serem criados, tais como as consultas de banco de dados, de outras partes da página.As partes da página que exigem menos recursos do servidor podem ser geradas dinamicamente para cada solicitação.

Quando você identificar as partes da página que você deseja fazer o cache e criar os controles de usuário que contêm cada uma dessas partes, você deve determinar as diretivas de cache para o controles de usuário.Você pode definir essas diretivas declarativamente usando a diretiva @ OutputCache, ou usando a classe PartialCachingAttribute no código do controle de usuário.

Por exemplo, se você incluir a diretiva a seguir na parte superior de um arquivo de controle de usuário (arquivo .ascx), uma versão do controle é armazenada no cache de saída por 120 segundos.

<%@ OutputCache Duration="120" VaryByParam="None" %>

Se você deseja definir cache de parâmetros no código, você pode usar um atributo na declaração da classe do controle de usuário.Por exemplo, se você incluir o atributo a seguir nos metadados de sua declaração de classe, uma versão do conteúdo é armazenado no cache de saída por 120 segundos:

[PartialCaching(120)]
public partial class CachedControl : System.Web.UI.UserControl
{
    // Class Code
}
<PartialCaching(120)> _
Partial Class CachedControl
    Inherits System.Web.UI.UserControl
    ' Class Code
End Class

Para obter mais informações sobre os atributos que você pode definir na saída da página, consulte o tópico @ OutputCache.Para obter mais informações sobre como desenvolver controles de usuário, consulte Visão geral sobre controles do servidor da Web do ASP.NET.

Observação:

Como você pode aninhar controles de usuário em uma página, você também pode aninhar controles de usuário que tenham sido posicionados no cache de saída.Você pode especificar configurações de cache diferentes para a página e para controles de usuário aninhados.

Referenciando Controles de Usuário em Cache Programaticamente

Ao criar um controle de usuário armazenável em cache (cacheable) declarativamente, você pode incluir um atributo ID a fim de referenciar programaticamente essa instância do controle de usuário.Entretanto, antes de fazer referência ao controle de usuário no código, você deve verificar a existência do controle de usuário no cache da saída.Um controle de usuário que está armazenado em cache é gerado dinamicamente apenas para a primeira solicitação; qualquer solicitação subsequente é atendida do cache de saída até que expire o tempo especificado.Após determinar que o controle de usuário foi instanciado, você pode manipular programaticamente o controle de usuário a partir da página que o contém.Por exemplo, se você atribuir declarativamente a um controle de usuário um ID de SampleUserControl, você pode verificar sua existência com o seguinte código:

protected void Page_Load(object sender, EventArgs e)
{
    if (SampleUserControl != null)
       // Place code manipulating SampleUserControl here.
}
Protected Sub Page_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles Me.Load
    If SampleUserControl <> Nothing Then
       ' Place code manipulating SampleUserControl here.
    End If
End Sub

Armazenando em Cache a Página e os Controles de Usuário para Durações Diferentes

Você pode definir diferentes valores de duração do cache de saída para uma página e para controles de usuário na página.Se a duração do cache de saída da página for maior que a duração do cache de saída do controle de usuário, a duração de cache de saída da página terá prioridade.Por exemplo, se o cache de saída da página é definido como 100 segundos e o cache de saída do controle de usuário é definido como 50 segundos, a página inteira, incluindo o controle de usuário, é armazenada no cache de saída por 100 segundos, independentemente da configuração menor para o controle de usuário.

O exemplo de código a seguir mostra o efeito de uma duração de tempo de cache maior na página que em um controle de usuário.A página está configurada para ser armazenada em cache por 100 segundos.

<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc01.ascx" %>
<%@ OutputCache duration="100" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

O exemplo de código a seguir mostra o controle de usuário incluído na página.A duração de cache para o controle é definida como 50 segundos.

<% @Control language="C#" %>
<% @OutputCache duration="50" varybyparam="none" %>

This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="50" varybyparam="none" %>

This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

Se a duração do cache de saída da página é menor que para um controle de usuário, o controle de usuário será armazenado em cache até que sua duração tenha expirado, mesmo após o restante da página ser regenerado por uma solicitação.Por exemplo, se o cache de saída da página é definido como 50 segundos e o cache de saída do controle de usuário é definido como 100 segundos, o controle de usuário expirará uma vez para cada duas vezes que o restante da página expirar.

O código a seguir mostra a marcação para uma página que contém o controle de usuário com uma duração de cache maior que a página.A página está configurada para ser armazenada em cache por 50 segundos.

<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>
 <% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<%@ Page language="VB" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="Uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>

<SampleControl:Time  /><br /> <br /> <br />

This page was most recently generated at:<p>
 <% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

O código a seguir mostra o controle de usuário incluído na página.A duração de cache para o controle é definida como 100 segundos.

<% @Control language="C#" %>
<% @OutputCache duration="100" varybyparam="none" %>

This user control was most recently generated at:<p>

<% DateTime t = DateTime.Now.ToString(); 
    Response.Write(t); %>
<% @Control language="VB" %>
<% @OutputCache duration="100" varybyparam="none" %>

This user control was most recently generated at:<p>
<% Dim t As DateTime = DateTime.Now.ToString()
Response.Write(t) %>

Consulte também

Conceitos

Visão geral do cache no ASP.NET

Atualizar dinamicamente porções de uma página em cache

Armazenando Múltiplas Versões de uma Página

Cache de dados de aplicativo

Configuração de cache no ASP.NET

Outros recursos

O que há de novo no cache do ASP.NET