Visual C# .NET を使用して ASP.NET でページ出力キャッシュを制御する方法


概要


この記事では、 @OutputCache ディレクティブを使用してASP.NETのページ出力キャッシュをVisual C#.NETで制御する方法を説明します。 この方法を使用すると、サイトの最も頻繁にアクセスされるページをキャッシュでき、Webサーバーのスループットを大幅に向上させることができます。 スループットは、通常、1秒あたりの要求数で測定されます。 この記事のサンプルコードでは、 Duration および VaryByParam 属性の使用方法について説明しますが、この記事には、 @OutputCache ディレクティブで使用できる他の方法の簡単な説明も含まれています。

注: この記事の目的は、@ OutputCachディレクティブのすべての属性とその使用法の詳細を説明することではありません。 詳細については、リファレンス を参照してください。

先頭に戻る

必要条件

  • Microsoft Windows 2000 または Windows XP
  • Microsoft .NET Framework
  • Microsoft Internet Information Server (IIS)
  • Microsoft ASP.NET
先頭に戻る

@ OutputCache ディレクティブの概要

@ OutputCache ディレクティブを使用してページ出力キャッシュを制御するには、単にこのディレクティブをページの上部に追加するだけです。 このディレクティブは、Page.InitOutputCache メソッドによって HttpCachePolicy クラスのメソッドに変換されます。

@ OutputCache ディレクティブに含まれる属性と設定値を次に示します。
  • Duration: この属性には、項目がキャッシュに保持される期間を指定します。 Duration の値は秒単位で記述します。
  • VaryByParam: この属性を使用すると、Get または Post パラメータに基づいてキャッシュ エントリが決定されます。 たとえば、VaryByParam 属性に testVal という名前の QueryString 変数を設定すると、
    異なる testVal 値を含むページ要求がそれぞれ異なるページとしてキャッシュされます。 VaryByParam 属性の構文を次のコードに示します。
    <%@ OutputCache Duration="Seconds" VaryByParam="testVal"%>
    注: 異なるバージョンの項目がすべてキャッシュされるようにするには、アスタリスク (*) を指定します。 キャッシュされる項目のバージョンが 1 つしかない場合は、"none" を指定することもできます。
  • Location: この属性には、項目がキャッシュされる場所を指定します。 以下の場所を指定できます。
    • 任意
    • クライアント
    • Downstream
    • サーバー
    • なし

    Location 属性の構文を次のコードに示します。
    <%@ OutputCache Duration="Seconds" Location="Client" %>
  • VaryByCustom: この属性はデフォルトで "Browser" に設定され、項目を要求したブラウザのバージョンごとに、その項目の異なるインスタンスがキャッシュされることを示します。 たとえば、Microsoft Internet Explorer 5 と Internet Explorer 5.5 の両方から項目が要求されたとします。 VaryByCustom が "Browser" に設定されていると、ブラウザのバージョンごとにキャッシュ エントリが作成されます。 この属性に "string" を設定しても、他のカスタム シナリオに対してキャッシュを制御することはできません。 Global.asax ファイルの HttpApplication.GetVaryByCustomString メソッドを無効にするコードを記述しない限り、"string" を指定しても効果はありません。

    VaryByCustom 属性の構文を次のコードに示します。
    <%@ OutputCache Duration="Seconds" VaryByCustom="string" %>
  • VaryByHeader: この属性には、キャッシュ エントリを切り替える条件として特定の HTTP ヘッダー値を指定できます。 VaryByHeader 属性の構文を次のコードに示します。
    <%@ OutputCache Duration="60" VaryByHeader="Accept-Language" %>
先頭に戻る

@ OutputCache Duration サンプルの作成手順

以下の手順では、ページ出力キャッシュの Duration 属性を使用して項目のキャッシュ期間を指定する方法を示します。
  1. 次の手順に従って、新しい Visual Basic ASP.NET Web アプリケーション プロジェクトを作成します。
    1. Visual Studio .NET を起動します。
    2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
    3. [新しいプロジェクト] ダイアログ ボックスで、[プロジェクトの種類] ボックスの一覧の [Visual C# プロジェクト] をクリックし、[テンプレート] ボックスの一覧の [ASP.NET Web アプリケーション] をクリックします。 [場所] ボックスで、URL パス内のデフォルトの名前を OutputCacheDemo に変更し、[OK] をクリックします。
  2. 次の手順に従って、Visual Studio .NET で新しい .aspx ページを作成します。
    1. ソリューション エクスプローラでプロジェクト ノードを右クリックし、[追加] をポイントして、[Web フォームの追加] をクリックします。
    2. [ファイル名] ボックスに OutputCacheDuration.aspx と入力し、[開く] をクリックします。
  3. Visual Studio .NET によってページに追加されたデフォルトの HTML コードを削除します。
  4. 次のコードを選択して右クリックし、[コピー] をクリックします。 Visual Studio .NET で [編集] メニューの [HTML として貼り付け] をクリックし、コードを .aspx ページに貼り付けます。
    <%@ OutputCache Duration="20" VaryByParam="none"%>
    <HTML>
    <HEAD>
    <script language="C#" runat="server">
    void Page_Load(object sender, EventArgs e)
    {
    Label1.Text = "Time: " + DateTime.Now.TimeOfDay.ToString();
    }
    </script>
    </HEAD>
    <body>
    <STRONG>@ OutputCache Duration Sample</STRONG>
    <hr>
    <br>
    <asp:Label id="Label1" runat="server">Label</asp:Label>
    <br>
    </body>
    </HTML>
  5. [ファイル] メニューの [OutputCacheDuration.aspx の保存] をクリックし、ページを保存します。
  6. 統合開発環境 (IDE) で [ビルド] メニューの [ソリューションのビルド] をクリックします。
  7. サンプルを実行するには、ソリューション エクスプローラで [OutputCacheDuration.aspx] を右クリックし、[ブラウザで表示] をクリックします。
  8. ブラウザにページが表示されたら、ラベルに表示されている時刻を確認します。
  9. ブラウザでページを最新の情報に更新します。 時刻が前と変わっていないことを確認します。 有効期間として設定されている 20 秒を経過してからページを更新した場合は、新しくキャッシュされたバージョンのページが表示されます。

    注: 外部ブラウザでページを表示している場合は、F5 キーを押すとページを更新できます。 Visual Studio .NET IDE の内部ブラウザでページを表示している場合は、そのページを右クリックし、[ブラウザの更新] をクリックするとページを更新できます。
先頭に戻る

@ OutputCache VaryByParam サンプルの作成手順

次の手順では、ページ出力キャッシュに VaryByParam 属性を使用して、 QueryString 変数値の1つの値に基づいて、キャッシュされたさまざまなバージョンのページを存在させる方法を示します。
  1. 次の手順に従って、Visual Studio .NET で新しい .aspx ページを作成します。
    1. ソリューション エクスプローラでプロジェクト ノードを右クリックし、[追加] をクリックして、[Web フォームの追加] をクリックします。
    2. [ファイル名] ボックスに
      OutputCacheVaryByParam.aspx と入力し、[開く] をクリックします。
  2. Visual Studio .NET によってページに追加されたデフォルトの HTML コードを削除します。
  3. 次のコードを選択して右クリックし、[コピー] をクリックします。 Visual Studio .NET で [編集] メニューの [HTML として貼り付け] をクリックし、コードを .aspx ページに貼り付けます。
    <%@ OutputCache Duration="20" VaryByParam="testVal"%>
    <HTML>
    <HEAD>
    <script language="C#" runat="server">
    void Page_Load(object sender, EventArgs e)
    {
    Label1.Text = "Time: " + DateTime.Now.TimeOfDay.ToString();
    }
    </script>
    </HEAD>
    <body>
    <P>
    <STRONG>@ OutputCache VaryByParam Sample</STRONG>
    </P>
    <P>
    <hr>
    </P>
    <P>
    <br>
    <asp:Label id="Label1" runat="server"></asp:Label>
    <br>
    <hr>
    <a href=http://yourservername/OutputCacheDemo/OutputCacheVaryByParam.aspx?testVal=123">testVal(123)</a>
    <br>
    <a href=http://yourservername/OutputCacheDemo/OutputCacheVaryByParam.aspx?testVal=345">testVal(345)</a>
    </P>
    </body>
    </HTML>
    注: 上記のコードでは、2 つのハイパーリンクを変更して、使用中の Web サーバーの名前を反映する必要があります。 また、VaryByParam 属性は、testVal という QueryString 変数の値に基づいて変化するように設定されています。 これにより、QueryString 変数の testVal の値が一致するインスタンスごとにページ出力がキャッシュされます。
  4. [ファイル] メニューの [OutputCacheVaryByParam.aspx の保存] をクリックし、ページを保存します。
  5. IDE で [ビルド] メニューの [ソリューションのビルド] をクリックします。
  6. サンプルを実行するには、ソリューション エクスプローラで [OutputCacheVaryByParam.aspx] を右クリックし、[ブラウザで表示] をクリックします。
  7. ブラウザにページが表示されたら、[testVal(123)] をクリックします。 これにより、ブラウザには同じページが表示されますが、testVal という QueryString 変数の値は "123" に設定されます。 表示された時刻を確認します。
  8. もう一度 [testVal(123)] をクリックします。 時刻が前と変わっていないことを確認します。 ページ出力は testVal 変数の値に基づいてキャッシュされています。
  9. [testVal(345)] をクリックします。 ページに新しい時刻が表示されることを確認します。
  10. もう一度 [testVal(345)] をクリックします。 前のページ出力がキャッシュされており、それがブラウザに表示されます。
  11. [testVal(123)] をクリックして最初のインスタンスに戻ります。 渡された QueryString 変数の値に基づき、別のバージョンのページ出力キャッシュが表示されます。
先頭に戻る

トラブルシューティング

  • VaryByParam を使用する場合は、QueryString 変数の値で大文字と小文字が変わると、異なるキャッシュ エントリが追加されることに注意する必要があります。
  • Duration は秒単位で指定することに注意する必要があります。
  • VaryByCustom を使用し、Global.asax ファイルの HttpApplication.GetVaryByCustomString メソッドを無効にしても、属性に指定されたカスタム文字列と一致する情報が見つからない場合は、デフォルトの設定である "Browser" が使用されます。
先頭に戻る

関連情報


ページ出力キャッシュの詳細については、以下のマイクロソフト Web サイトを参照してください。
GotDotNet クイック スタート チュートリアル「ページの出力キャッシュ」
Microsoft .NET Framework Software Development Kit (SDK)
http://msdn2.microsoft.com/ja-jp/library/ms950382.aspx

ASP.NET ページのキャッシュ
http://msdn2.microsoft.com/ja-jp/library/xsbfdd8c(vs.71).aspx

@ OutputCache
http://msdn2.microsoft.com/ja-jp/library/hdxfb6cy(vs.71).aspx
先頭に戻る