ASP.NET ページの一部だけのキャッシュ

更新 : 2007 年 11 月

要求ごとにページの一部だけを変更する必要がある場合は、ページ全体をキャッシュするのが適切でないことがあります。そのような場合は、ページの一部だけをキャッシュできます。ページの一部だけをキャッシュするオプションには、コントロール キャッシュとキャッシュ後の置換の 2 つがあります。

コントロール キャッシュ (フラグメント キャッシュとも呼ばれます) では、キャッシュ対象のコンテンツを格納するユーザー コントロールを作成し、このコントロールをキャッシュ可能にすることで、ページ出力の一部をキャッシュできます。これにより、ページ全体が再作成されるたびに、ページ内の特定のコンテンツをキャッシュできます。たとえば、株式情報などの動的なコンテンツだけでなく、週間概況などの静的なセクションも含むページを作成する場合は、静的なセクションをユーザー コントロールに作成し、このユーザー コントロールだけがキャッシュされるように設定できます。

キャッシュ後の置換は、コントロール キャッシュとは対照的です。ページはキャッシュされますが、ページ内のフラグメントは動的なのでキャッシュされません。たとえば、ニュース記事のページなど、設定された期間にわたって完全に静的なページを作成する場合は、ページ全体がキャッシュされるように設定できます。このキャッシュ対象ページにローテーション型のバナー広告を追加すると、バナー広告はページの要求間で切り替わらなくなります。しかし、キャッシュ後の置換を使用すると、ページをキャッシュでき、特定の部分をキャッシュ不可能に設定できます。上の例では、バナー広告をキャッシュ不可能に設定できます。これにより、バナー広告はページ要求ごとに動的に生成され、キャッシュされたページ出力に追加されます。キャッシュ後の置換の詳細については、「キャッシュ ページの動的な部分更新」を参照してください。

コントロール キャッシュ

コンテンツをキャッシュするためのユーザー コントロールを作成すると、ページの一部、たとえばデータベース クエリのように、生成するのに多くのプロセッサ時間を必要とする部分をその他の部分から切り離すことができます。サーバー リソースをさほど必要としないページの部分は、要求ごとに動的に生成できます。

ページの中でキャッシュする部分を識別し、それぞれの部分を格納するユーザー コントロールを作成したら、これらのユーザー コントロールのキャッシュ ポリシーを決める必要があります。これらのポリシーは、@ OutputCache ディレクティブを使用して宣言的に設定でき、またユーザー コントロールのコードで PartialCachingAttribute クラスを使用して設定することもできます。

たとえば、ユーザー コントロール ファイル (.ascx file) の先頭に次のディレクティブを組み込むと、コントロールの 1 つのバージョンが出力キャッシュに 120 秒間格納されます。

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

キャッシュ パラメータをコードで設定する場合は、ユーザー コントロールのクラス宣言で属性を使用できます。たとえば、クラス宣言のメタデータに次の属性を追加すると、コンテンツの 1 つのバージョンが出力キャッシュに 120 秒間格納されます。

[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

ページ出力に対して設定できる属性の詳細については、@ OutputCache に関するトピックを参照してください。また、ユーザー コントロールの作成方法の詳細については、「ASP.NET Web サーバー コントロールの概要」を参照してください。

h30h475z.alert_note(ja-jp,VS.90).gifメモ :

ユーザー コントロールはページ上で入れ子にできるので、出力キャッシュに格納されているユーザー コントロールも入れ子にできます。ページと入れ子のユーザー コントロールには、それぞれ別々のキャッシュ設定を指定できます。

キャッシュされたユーザー コントロールのプログラムによる参照

キャッシュ可能なユーザー コントロールを宣言的に作成するときは、ユーザー コントロールのインスタンスをプログラムによって参照するために ID 属性を追加できます。ただし、ユーザー コントロールをコードで参照する前に、ユーザー コントロールが出力キャッシュに存在することを確認する必要があります。キャッシュされるユーザー コントロールは、最初の要求時にのみ動的に生成されます。それ以降の要求は、指定の期限が切れるまで出力キャッシュによって処理されます。ユーザー コントロールがインスタンス化されたことを確認したら、ユーザー コントロールを含むページからそのユーザー コントロールをプログラムによって操作できます。たとえば、SampleUserControl のユーザー コントロール ID を宣言によって割り当てる場合は、次のコードを使用してその存在を確認できます。

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

キャッシュ期間が異なるページとユーザー コントロールのキャッシュ

ページとページ上のユーザー コントロールには、それぞれ異なる出力キャッシュ期間の値を設定できます。ページの出力キャッシュ期間がユーザー コントロールの出力キャッシュ期間よりも長い場合は、ページの出力キャッシュ期間の方が優先されます。たとえば、ページ出力キャッシュが 100 秒に設定されており、ユーザー コントロール出力キャッシュが 50 秒に設定されている場合は、ユーザー コントロールの設定に関係なく、ユーザー コントロールを含むページ全体が出力キャッシュ内に 100 秒間格納されます。

次のコード例は、ユーザー コントロールよりもページの方がキャッシュ期間が長い場合を示しています。このページのキャッシュ期間は 100 秒に設定されています。

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

<SampleControl:Time runat="server" /><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 runat="server" /><br /> <br /> <br />

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

次のコード例は、ページに含まれているユーザー コントロールを示しています。ユーザー コントロールのキャッシュ期間は 50 秒に設定されています。

<% @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) %>

ページの出力キャッシュ期間がユーザー コントロールの出力キャッシュ期間よりも短い場合は、要求に応じてページの他の部分が再生成された後も、ユーザー コントロールは、そのキャッシュ期間が終了するまでキャッシュに格納されます。たとえば、ページの出力キャッシュ期間が 50 秒に設定されており、ユーザー コントロールの出力キャッシュ期間が 100 秒に設定されている場合は、ページの他の部分の有効期限が 2 回切れる間に、ユーザー コントロールの有効期限が 1 回切れます。

次のコードは、キャッシュ期間がページよりも長いユーザー コントロールを含むページのマークアップを示しています。ページのキャッシュ期間は 50 秒に設定されています。

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

<SampleControl:Time runat="server" /><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 runat="server" /><br /> <br /> <br />

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

次のコードは、ページに含まれているユーザー コントロールを示しています。ユーザー コントロールのキャッシュ期間は 100 秒に設定されています。

<% @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) %>

参照

概念

ASP.NET のキャッシュの概要

キャッシュ ページの動的な部分更新

ページの複数バージョンのキャッシュ

アプリケーション データのキャッシュ

ASP.NET のキャッシュの構成

その他の技術情報

ASP.NET のキャッシュの新機能