この記事では、Visual C# .NET を使用して ASP.NET でフラグメント キャッシュを実行する方法について説明します。
元の製品バージョン: Microsoft ASP.NET
元の KB 番号: 308378
まとめ
この記事では、ASP.NET でフラグメント キャッシュを実装する方法について説明します。 フラグメント キャッシュは、実際には Web フォームのコード フラグメントを直接キャッシュしません。フラグメント キャッシュとは、Web フォーム内の個々のユーザー コントロール (.ascx) のキャッシュを指します。 各ユーザー コントロールには、キャッシュ動作を適用する方法の独立したキャッシュ期間と実装を設定できます。 この記事のサンプル コードは、この機能を実現する方法を示しています。
フラグメント キャッシュは、ページのサブセットのみをキャッシュする必要がある場合に便利です。 ナビゲーション バー、ヘッダー、フッターは、フラグメント キャッシュの候補として適しています。
要件
- Windows 2000
- Internet Information Server (IIS)
- .NET Framework
- ASP.NET
C# .NET を使用して ASP.NET Web アプリケーションを作成する
次の手順では、 FragmentCache という名前の新しい ASP.NET Web アプリケーションを作成する方法を示します。
Visual Studio .NET を開く
[ファイル] メニューの [新規作成] をポイントし、 [プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスで、[プロジェクトの種類] の下の [Visual C# プロジェクト] をクリックし、[テンプレート] の下の [Web アプリケーションASP.NET] をクリック。
[ Name ボックスに「 FragmentCache」と入力します。 [ Location ボックスで、適切なサーバーを選択します。 ローカル サーバーを使用している場合は、サーバー名を
http://localhost
のままにすることができます。
ユーザー コントロールを作成する
このセクションでは、この記事で使用する各ユーザー コントロールのサンプル コードと説明を示します。 説明に従って、サンプル コードをコピーして associated.ascx ファイルと分離コード ページに貼り付けることができます。
ユーザー コントロール 1 (FragmentCtrl1.ascx)
次のユーザー コントロール FragmentCtrl1.ascx は単純です。 FragmentCtrl1.ascx は、項目のキャッシュ エントリが発生した時刻を書き出します。 この記事で作成するすべてのコントロールと同様に、コントロールに関する基本的な説明が用意されており、後のセクションで実行時に設定と関連する動作を簡単に区別できます。
Visual Studio .NET で、次のように新しいユーザー コントロールを作成します。
- ソリューション エクスプローラーで、project ノードを右クリックし、Add をポイントし、[Web ユーザー コントロールの追加] クリック。
- コントロールに FragmentCtrl1.ascx という名前を付け、 Open をクリックします。
Design タブが選択されていることを確認します。 ツールボックスの Web Forms セクションから Web フォーム ラベル コントロールをクリックしてドラッグし、Label コントロールをページにドロップします。
[ラベル] コントロールをクリックします。 Properties Visual Studio .NET 統合開発環境 (IDE) のウィンドウで、ID プロパティに「CacheEntryTime」と入力し、Text プロパティを空白のままにします。
HTML ビューに切り替え、次の
@ OutputCache
ディレクティブをページの上部に追加します。<%@ OutputCache Duration="40" VaryByParam="none"%>
.ascx ファイルを右クリックし、[コードの表示] クリックして分離ページ ソースを表示します。
CacheEntryTime
ラベルのText
プロパティを設定するPage_Load
イベントに次のコードを追加します。private void Page_Load(object sender, System.EventArgs e) { CacheEntryTime.Text ="FragmentCtrl1: " + DateTime.Now.TimeOfDay.ToString(); }
ユーザー コントロール 2 (FragmentCtrl2.ascx)
異なるキャッシュ期間を持つ最初のコントロールの別のバージョンを作成するだけで、複数のユーザー コントロールが同じページで独立した動作を持つ方法を示すことができますが、このセクションでは、2 番目のコントロールである FragmentCtrl2.ascx をより興味深いものにします。 FragmentCtrl2.ascx は、 VaryByControl 属性を導入するために使用されます。 VaryByControl を使用すると、指定したコントロールの値に基づいて、異なるキャッシュ エントリを作成できます。 この機能は、次のセクションで実行時により明確になります。
Visual Studio .NET で、次のように新しいユーザー コントロールを作成します。
- ソリューション エクスプローラーで、project ノードを右クリックし、Add をポイントし、[Web ユーザー コントロールの追加] クリック。
- コントロールに FragmentCtrl2.ascx という名前を付け、 Open をクリックします。
Design タブが選択されていることを確認します。 ツールボックスの Web Forms セクションから Web フォーム ラベル コントロールをクリックしてドラッグし、Label コントロールをページにドロップします。
[ラベル] コントロールをクリックします。 Properties ペインで、ID プロパティに「CacheEntryTime」と入力し、Text プロパティを空白のままにします。
Label コントロールの直後にカーソルを置き、 ENTER キーを押して、ページ内の次の行に移動します。
ツールボックスの Web Forms セクションから Web フォーム RadioButtonList コントロールをクリックしてドラッグし、ページにドロップします。 RadioButtonList コントロールは、Label コントロールの後の行に単独で表示されます。
RadioButtonList コントロールをクリックします。 Properties ペインで、ID プロパティに「MyRadioButtonList」と入力します。
Properties ペインで、MyRadioButtonList コントロールの Items プロパティを見つけ、Collectionをクリックし、Collection の横に表示される ellipsis (...) ボタンをクリックします。
ListItem コレクション エディター ウィンドウで、次のように ListItem メンバーを追加します。
- [ Members で、[追加 ] をクリック。
- ListItem properties セクションで、Text と Value を Yes に設定し、Selected を True に設定します。
- [ Members で、もう一度 [追加] クリック 。
- ListItem properties セクションで、Text と Value を No に設定し、Selected を False に設定します。
- [ Membersで、最後に 1 つ 追加 をクリックします。
- ListItem properties セクションで、Text と Value を Maybe に設定し、Selected を False に設定します。
- OK をクリックして、Design ビューの .ascx ファイルに戻ります。 RadioButtonList コントロールに含まれる 3 つのラジオ ボタンが表示されます。 Yes、 No、 Maybe。
RadioButtonList コントロールの直後にカーソルを置き、 ENTER キーを押して、ページ内の次の行に移動します。
ツールボックスの Web Forms セクションから Web フォーム ボタン コントロールをクリックしてドラッグし、ページにドロップします。 Button コントロールは、RadioButtonList コントロールの後の行に単独で表示されます。
ボタン コントロールをクリックします。 Properties ペインで、Text プロパティに「Submit」と入力します。
HTML ビューに切り替え、次の
@OutputCache
ディレクティブをページの上部に追加します。<%@ OutputCache Duration="60" VaryByParam="none" VaryByControl="MyRadioButtonList"%>
.ascx ファイルを右クリックし、[コードの表示] クリックして分離ページ ソースを表示します。
CacheEntryTime
ラベルのText
プロパティを設定するPage_Load
イベントに次のコードを追加します。private void Page_Load(object sender, System.EventArgs e) { CacheEntryTime.Text = "FragmentCtrl2: " + DateTime.Now.TimeOfDay.ToString(); }
ユーザー コントロールを含む Web フォームを作成する
新しく開発したユーザー コントロールを含む Web フォーム (.aspx) を作成できるようになりました。 Web フォームを作成するには、次の手順に従います。
次のように、 FragmentCaching.aspx という名前の新しい Web フォームを Visual Studio .NET でプロジェクトに追加します。
- ソリューション エクスプローラーで、project ノードを右クリックし、Add をポイントして、[Web フォームの追加] をクリック。
- Web フォーム FragmentCaching.aspxに名前を付け、[開く ] をクリック。
Design タブが選択されていることを確認します。 ツールボックスの Web Forms セクションから Web フォーム ラベル コントロールをクリックしてドラッグし、ページにドロップします。
[ラベル] コントロールをクリックします。 Properties ペインで、ID プロパティに「Time」と入力し、Text プロパティを空白のままにします。
Label コントロールの直後にカーソルを置き、 ENTER キーを押して、ページ内の次の行に移動します。
FragmentCtrl1.ascx をドラッグし、Web フォームにドロップして、ラベル コントロールの後に配置します。 コントロールの直後にカーソルを置き、 ENTER キーを押して、ページ内の次の行に移動します。
FragmentCtrl2.ascx をドラッグし、Web フォームにドロップして、FragmentCtrl1.ascx の後に配置します。
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>
Note
コントロールが次の場所に配置されていることを確認します。
.aspx ファイルを右クリックし、[コードの表示] クリックして分離コード ページ のソースを表示します。
Time
ラベルのText
プロパティを設定するPage_Load
イベントに次のコードを追加します。private void Page_Load(object sender, System.EventArgs e) { Time.Text = "WebFormTime: " + DateTime.Now.TimeOfDay.ToString(); }
File メニューの Save All をクリックして、ユーザー コントロール、Web フォーム、およびその他の関連するプロジェクト ファイルを保存します。
Visual Studio .NET 統合開発環境 (IDE) の Build メニューから Build をクリックしてプロジェクトをビルドします。
サンプルを実行する
このセクションでは、実行時にコードを表示してキャッシュ動作を監視する方法を示し、コードが実行される理由を簡単に説明します。
Visual Studio .NET IDE ソリューション エクスプローラーで、FragmentCaching.aspx Web フォームを右クリックし、 View in Browser をクリックしてコードを実行します。
ブラウザーにページが表示されたら、そのページを右クリックし、 Refresh をクリックしてページを更新します。 F5 キーを押して、Visual Studio .NET IDE の外部にあるブラウザーでページを表示している場合は、ページを更新。
Note
Web フォーム上の時刻は更新されましたが、ユーザー コントロールには、関連付けられているキャッシュ エントリが作成された時刻が引き続き表示されます。
2 つ目のコントロールで、[ Submit をクリックします。 コントロールに更新された時刻が表示されていることに注意してください。 これは、RadioButtonList コントロールを参照するユーザー コントロールの VaryByControl 属性設定に応答します。
[ No] をクリックし、もう一度 [ Submit をクリックします。
Note
時刻は、ユーザー コントロールの表示で再び更新されます。 これは、この No 値の設定に基づいて、コントロールに対して新しいキャッシュ エントリが作成されるためです。 Maybe オプションを除き、この手順を繰り返します。 同じ動作が表示されます。
[ Yes] をクリックし、もう一度 [ Submit をクリックします。 No オプションと Maybe オプションを使用して、この操作を繰り返します。
これらのコントロールの選択はキャッシュされ、以前のキャッシュ エントリ時間が表示されます。 引き続き Submit @ OutputCache ディレクティブの期間の設定を超えてクリックすると、RadioButtonList コントロールの特定の値の選択ごとにユーザー コントロールの時刻が更新されます。
Note
フラグメント キャッシュに関して考えられるすべての設定とシナリオについて説明することは、この記事の目的ではありません。
トラブルシューティング
出力キャッシュされているユーザー コントロールをプログラムで操作しないでください。 これは、キャッシュ エントリが発生する前に、コントロールが初回実行時にのみ動的に作成されるためです。 出力キャッシュは、コントロールの有効期限が切れるまで、他のすべての要求を満たします。
ユーザー コントロールがホストされている Web フォームに、ユーザー コントロールの期間よりも長い出力キャッシュ期間がある場合、Web フォームの設定によってコントロールのキャッシュ動作が決まります。