Visual C# .NET を使用して ASP.NET でフラグメント キャッシュを実行する

この記事では、Visual C# .NET を使用して ASP.NET でフラグメント キャッシュを実行する方法について説明します。

元の製品バージョン: Microsoft ASP.NET
元の KB 番号: 308378

概要

この記事では、ASP.NET でフラグメント キャッシュを実装する方法について説明します。 フラグメント キャッシュは、実際には Web フォームのコード フラグメントを直接キャッシュしません。フラグメント キャッシュは、Web フォーム内の個々のユーザー コントロール (.ascx) のキャッシュを指します。 各ユーザー コントロールには、キャッシュの期間とキャッシュ動作の適用方法の実装を個別に設定できます。 この記事のサンプル コードでは、この機能を実現する方法を示します。

フラグメント キャッシュは、ページのサブセットのみをキャッシュする必要がある場合に便利です。 ナビゲーション バー、ヘッダー、フッターは、フラグメント キャッシュに適しています。

要件

  • Windows 2000
  • インターネット インフォメーション サーバー (IIS)
  • .NET Framework
  • ASP.NET

C# .NET を使用して ASP.NET Web アプリケーションを作成する

次の手順では、 FragmentCache という名前の新しい ASP.NET Web アプリケーションを作成する方法を示します。

  1. Visual Studio .NET を開く

  2. [ ファイル] メニューの [ 新規] をポイントし、[ プロジェクト] をクリックします。

  3. [新しいプロジェクト] ダイアログ ボックスで、[プロジェクトの種類] の [Visual C# プロジェクト] をクリックし、[テンプレート] の下にある [ASP.NET Web アプリケーション] をクリックします。

  4. [ 名前 ] ボックスに「 FragmentCache」と入力します。 [ 場所 ] ボックスで、適切なサーバーを選択します。 ローカル サーバーを使用している場合は、サーバー名を として http://localhost残すことができます。

ユーザー コントロールを作成する

このセクションでは、この記事で使用する各ユーザー コントロールのサンプル コードと説明を示します。 説明に従って、サンプル コードをコピーして associated.ascx ファイルと分離コード ページに貼り付けることができます。

ユーザー コントロール 1 (FragmentCtrl1.ascx)

次のユーザー コントロール FragmentCtrl1.ascx は単純です。 FragmentCtrl1.ascx は、項目のキャッシュ エントリが発生した時刻を書き出します。 この記事で作成されるすべてのコントロールと同様に、コントロールに関する基本的な説明を用意して、後のセクションで実行時に設定と関連する動作を区別しやすくします。

  1. Visual Studio .NET で、次のように新しいユーザー コントロールを作成します。

    1. ソリューション エクスプローラーで、プロジェクト ノードを右クリックし、[追加] をポイントし、[Web ユーザー コントロールの追加] をクリックします。
    2. コントロールに FragmentCtrl1.ascx という名前を付け、[ 開く] をクリックします。
  2. [ デザイン ] タブが選択されていることを確認します。 ツールボックスの [Web Forms] セクションから [Web フォーム ラベル] コントロールをクリックしてドラッグし、ラベル コントロールをページにドロップします。

  3. [ラベル] コントロールをクリックします。 Visual Studio .NET 統合開発環境 (IDE) の [プロパティ] ウィンドウで、ID プロパティに「CacheEntryTime」と入力し、Text プロパティは空白のままにします。

  4. HTML ビューに切り替え、次@ OutputCacheのディレクティブをページの上部に追加します。

    <%@ OutputCache Duration="40" VaryByParam="none"%>
    
  5. .ascx ファイルを右クリックし、[コードの表示] をクリックして分離コード ページ ソースを表示します。

  6. ラベルのプロパティを設定するイベントにPage_Load次のTextコードをCacheEntryTime追加します。

    private void Page_Load(object sender, System.EventArgs e)
    {
        CacheEntryTime.Text ="FragmentCtrl1: " + DateTime.Now.TimeOfDay.ToString();
    }
    

ユーザー コントロール 2 (FragmentCtrl2.ascx)

キャッシュ期間が異なる最初のコントロールの別のバージョンを作成するだけで、複数のユーザー コントロールが同じページで独立した動作を持つ方法を示すことができますが、このセクションでは、2 番目のコントロール FragmentCtrl2.ascx をより興味深いものにします。 FragmentCtrl2.ascxVaryByControl 属性を導入するために使用されます。 VaryByControl を使用すると、指定したコントロールの値に基づいて異なるキャッシュ エントリを作成できます。 この機能は、次のセクションで実行時にはるかに明確になります。

  1. Visual Studio .NET で、次のように新しいユーザー コントロールを作成します。

    1. ソリューション エクスプローラーで、プロジェクト ノードを右クリックし、[追加] をポイントし、[Web ユーザー コントロールの追加] をクリックします。
    2. コントロールに FragmentCtrl2.ascx という名前を付け、[ 開く] をクリックします。
  2. [ デザイン ] タブが選択されていることを確認します。 ツールボックスの [Web Forms] セクションから [Web フォーム ラベル] コントロールをクリックしてドラッグし、ラベル コントロールをページにドロップします。

  3. [ラベル] コントロールをクリックします。 [プロパティ] ウィンドウの ID プロパティに「CacheEntryTime」と入力し、Text プロパティは空白のままにします。

  4. ラベル コントロールの直後にカーソルを置き、 Enter キー を押してページ内の次の行に移動します。

  5. ツールボックスの [Web Forms] セクションから Web フォーム RadioButtonList コントロールをクリックしてドラッグし、ページにドロップします。 RadioButtonList コントロールは、Label コントロールの後の行に単独で表示されます。

  6. RadioButtonList コントロールをクリックします。 [プロパティ] ウィンドウで、ID プロパティに「MyRadioButtonList」と入力します。

  7. [プロパティ] ウィンドウで、MyRadioButtonList コントロールの Items プロパティを見つけて、[コレクション] をクリックし、[コレクション] の横に表示される省略記号 (...) ボタンをクリックします。

  8. [ListItem コレクション] エディター ウィンドウで、次のように ListItem メンバーを追加します。

    1. [メンバー][追加] をクリックします。
    2. [ ListItem プロパティ] セクションで、[ テキスト] と [ 値][はい] に設定し、[ 選択済み][True] に設定します。
    3. [ メンバー] で、もう一度 [追加 ] をクリックします。
    4. [ ListItem プロパティ] セクションで、[ テキスト] と [ 値][いいえ] に設定し、[ 選択][False] に設定します。
    5. [ メンバー] で、[最後に 1 つ 追加 ] をクリックします。
    6. [ ListItem のプロパティ] セクションで、[ テキスト] と [ 値][たぶん] に設定し、[ 選択済み][False] に設定します。
    7. [OK] をクリックして、デザイン ビューの .ascx ファイルに戻ります。 RadioButtonList コントロールに含まれている 3 つのラジオ ボタンが表示されます。 はいいいえおよび可能性があります
  9. RadioButtonList コントロールの直後にカーソルを置き、 Enter キー を押してページ内の次の行に移動します。

  10. ツールボックスの [Web Forms] セクションから [Web フォーム ボタン] コントロールをクリックしてドラッグし、ページにドロップします。 Button コントロールは、RadioButtonList コントロールの後の行に単独で表示されます。

  11. ボタン コントロールをクリックします。 [プロパティ] ウィンドウの [テキスト] プロパティに「Submit」と入力します。

  12. HTML ビューに切り替え、次@OutputCacheのディレクティブをページの上部に追加します。

    <%@ OutputCache Duration="60" VaryByParam="none" VaryByControl="MyRadioButtonList"%>
    
  13. .ascx ファイルを右クリックし、[コードの表示] をクリックして分離コード ページ ソースを表示します。

  14. ラベルのプロパティを設定するイベントにPage_Load次のTextコードをCacheEntryTime追加します。

    private void Page_Load(object sender, System.EventArgs e)
    {
        CacheEntryTime.Text = "FragmentCtrl2: " + DateTime.Now.TimeOfDay.ToString();
    }
    

ユーザー コントロールを含む Web フォームを作成する

Web フォーム (.aspx) を作成して、新しく開発したユーザー コントロールを格納できるようになりました。 Web フォームを作成するには、次の手順に従います。

  1. FragmentCaching.aspx という名前 の新しい Web フォームを Visual Studio .NET のプロジェクトに次のように追加します。

    1. ソリューション エクスプローラーで、プロジェクト ノードを右クリックし、[追加] をポイントし、[Web フォームの追加] をクリックします。
    2. Web フォーム FragmentCaching.aspxに名前を け、[ 開く] をクリックします。
  2. [ デザイン ] タブが選択されていることを確認します。 ツールボックスの [Web Forms] セクションから [Web フォーム ラベル] コントロールをクリックしてドラッグし、ページにドロップします。

  3. [ラベル] コントロールをクリックします。 [プロパティ] ウィンドウで、ID プロパティに「Time」と入力し、Text プロパティは空白のままにします。

  4. ラベル コントロールの直後にカーソルを置き、 Enter キー を押してページ内の次の行に移動します。

  5. FragmentCtrl1.ascx をドラッグし、Web フォームにドロップして、単独で行の Label コントロールの後に配置されるようにします。 コントロールの直後にカーソルを置き、 Enter キー を押してページ内の次の行に移動します。

  6. FragmentCtrl2.ascx をドラッグし、Web フォームにドロップして、FragmentCtrl1.ascx の後に配置されるようにします。

  7. HTML ビューでは、Web フォームは次のコードのように表示されます。

    <%@ Page language ="c#" Codebehind="FragmentCaching.aspx.cs"
       AutoEventWireup="false" Inherits="FragmentCache.FragmentCaching" %>
    <%@ Register TagPrefix="uc1" TagName="FragmentCtrl1" Src="FragmentCtrl1.ascx" %>
    <%@ Register TagPrefix="uc1" TagName="FragmentCtrl2" Src="FragmentCtrl2.ascx" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
       <HEAD>
          <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
          <meta name="CODE_LANGUAGE" Content="C#">
          <meta name="vs_defaultClientScript" content="JavaScript (ECMAScript)">
          <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
       </HEAD>
       <body>
          <form id="FragmentCaching" method="post" runat="server">
             <P>
                WebForm Time:
                <asp:Label id="Time" runat="server" ForeColor="Blue"></asp:Label>
             </P>
             <P>
                <uc1:FragmentCtrl1 id="FragmentCtrl11" runat="server">
                </uc1:FragmentCtrl1>
             </P>
             <P>
                <uc1:FragmentCtrl2 id="FragmentCtrl21" runat="server">
                </uc1:FragmentCtrl2>
             </P>
          </form>
       </body>
    </HTML>
    

    注:

    コントロールが 内に配置されていることを確認します。

  8. .aspx ファイルを右クリックし、[コードの表示] をクリックして分離コード ページ ソースを表示します。

  9. ラベルのプロパティを設定するイベントにPage_Load次のTextコードをTime追加します。

    private void Page_Load(object sender, System.EventArgs e)
    {
        Time.Text = "WebFormTime: " + DateTime.Now.TimeOfDay.ToString();
    }
    
  10. [ ファイル ] メニューの [ すべて保存 ] をクリックして、ユーザー コントロール、Web フォーム、およびその他の関連するプロジェクト ファイルを保存します。

  11. Visual Studio .NET 統合開発環境 (IDE) の [ビルド] メニューで、[ビルド] をクリックしてプロジェクトをビルドします。

サンプルを実行する

このセクションでは、実行時にコードを表示してキャッシュ動作を監視する方法を示し、コードが実行される理由を簡単に説明します。

  1. Visual Studio .NET IDE ソリューション エクスプローラーで、FragmentCaching.aspx Web フォームを右クリックし、[ブラウザーで表示] をクリックしてコードを実行します。

  2. ブラウザーにページが表示されたら、ページを右クリックし、[ 更新 ] をクリックしてページを更新します。 Visual Studio .NET IDE の外部にあるブラウザーでページを表示している場合は、F5 キーを押してページを更新することもできます。

    注:

    Web フォームの時刻は更新されましたが、ユーザー コントロールには、関連付けられているキャッシュ エントリが作成された時刻が表示されます。

  3. 2 つ目のコントロールで、[ 送信] をクリックします。 コントロールに更新された時刻が表示されます。 これは、RadioButtonList コントロールを参照するユーザー コントロールの VaryByControl 属性設定に応答します。

  4. [ いいえ] をクリックし、もう一度 [送信 ] をクリックします。

    注:

    時刻は、ユーザー コントロールのディスプレイで再び更新されます。 これは、この [値なし ] 設定に基づいてコントロールに対して新しいキャッシュ エントリが作成されるためです。 [たぶん] オプションを除き、この手順を繰り返します。 同じ動作が表示されます。

  5. [ はい] をクリックし、もう一度 [送信 ] をクリックします。 [いいえ] オプションと [可能性あり] オプションを使用して、この操作を繰り返します。

    コントロールのこれらの選択はキャッシュされ、以前のキャッシュ エントリ時間が表示されます。 @OutputCache ディレクティブの期間設定を超えて [送信] をクリックすると、RadioButtonList コントロールの特定の値の選択ごとにユーザー コントロールの時刻が更新されます。

注:

フラグメント キャッシュに関して考えられるすべての設定とシナリオについて説明することは、この記事の目的ではありません。

トラブルシューティング

  • 出力キャッシュされたユーザー コントロールをプログラムで操作しないでください。 これは、コントロールがキャッシュ エントリが発生する前に初めて実行されたときにのみ動的に作成されるためです。 出力キャッシュは、コントロールの有効期限が切れるまで、他のすべての要求を満たします。

  • ユーザー コントロールがホストされている Web フォームの出力キャッシュ期間が、ユーザー コントロールの期間よりも長い場合、Web フォームの設定によってコントロールのキャッシュ動作が決まります。