-
置換コントロールを使用すると、動的に更新してキャッシュされたページに統合できる領域を Web ページ上に作成できます。
1.計画
置換コントロールを使用して、動的コンテンツの出力をキャッシュする Web ページの部分を指定します。コンテンツの大部分がキャッシュされているページの場合、置換コントロールは部分的なページ キャッシュに対する簡素化されたソリューションを提供します。ページ全体の出力をキャッシュし、置換コントロールを使用して、キャッシュされないページの部分を指定できます。キャッシュ領域は 1 回だけ実行され、キャッシュ エントリが期限切れになるかクリアされるまでキャッシュから読み取られます。動的領域は、ページが要求されるたびに実行されます。このキャッシュ モデルを使用すると、この静的コンテンツをキャッシュに入れるために Web ユーザー コントロールにカプセル化する必要がないため、コンテンツがほとんど静的な Web ページのコーディングが簡素化されます。たとえば、このキャッシュ モデルは、静的コンテンツ (ニュース記事など) と広告を表示する AdRotator コントロールを含む Web ページに役立ちます。ニュース記事は頻繁には変更されないため、キャッシュすることができます。ユーザーがページをリクエストするたびに新しい広告を表示したい場合があります。 AdRotator コントロールは、ポストキャッシュ置換を直接サポートしており、Web ページがキャッシュされているかどうかに関係なく、Web ページのポストバックごとに新しい広告をレンダリングします。
2. 背景
ASP.NET Web ページをキャッシュすると、デフォルトでは、ページからのすべての出力がキャッシュされます。最初のリクエストでページが実行され、その出力がキャッシュされます。後続のリクエストでは、これはキャッシュによって行われ、そのページのコードは実行されません。
場合によっては、ASP.NET Web ページをキャッシュするだけでなく、ページが要求されるたびにページの選択した部分を更新することもできます。たとえば、ページの大部分をキャッシュしたいが、ページ上の時間に敏感な情報を動的に更新する必要がある場合があります。
置換コントロールを使用して、キャッシュされたページに動的コンテンツを挿入できます。 Substitution コントロールはマークアップをレンダリングしません。したがって、コントロールを Web ページまたは親ユーザー コントロールのメソッドにバインドする必要があります。 Web ページに挿入する情報を返す静的メソッドを作成する必要があります。置換コントロールによって呼び出されるメソッドは、次の基準を満たしている必要があります。
·静的メソッドである必要があります (Visual Basic で共有)。
·HttpContext タイプのパラメータを受け入れる必要があります。
·String型の値を返す必要があります。
置換コントロールは、Web ページ上の他のコントロールにアクセスできません。つまり、他のコントロールの値を検査したり変更したりすることはできません。ただし、コードは、渡されたパラメーターを使用して、現在のページのコンテキストにアクセスできます。
ページが実行されると、置換コントロールはこのメソッドを呼び出し、ページ上の置換コントロールをメソッドからの戻り値で置き換えます。
コード例
次の例は、置換コントロールを使用して、キャッシュされたページ上に動的に更新可能なコンテンツを作成する方法を示しています。ページの Load イベントのコードは、現在の時刻で Label コントロールを更新します。ページのキャッシュ期間は 60 秒に設定されているため、60 秒以内にページが複数回要求された場合でも、Label コントロールのテキストは変更されません。ページ上の Substitution コントロールは静的メソッド GetTime を呼び出し、現在の時刻を文字列として返します。 Web ページが更新されるたびに、置換コントロールによって表される値が更新されます。
<%@ ページ言語="C#" %>
<%@ OutputCache 期間=60 VaryByParam="None" %>
<script runat="サーバー">
void Page_Load()
{
Label1.Text = DateTime.Now.ToString();
}
public static String GetTime(HttpContext コンテキスト)
{
DateTime.Now.ToString() を返します。
}
</script>
<html>
<head runat="server"></head>
<本文>
<form id="form1" runat="server">
<div>
<p>
<asp:Label runat="server" ID="Label1" />
</p>
<p>
<asp:Substitution runat="サーバー"
ID="置換1"
メソッド名="GetTime" />
</p>
<p>
<asp:Button runat="server" ID="Button1" Text="Submit"/>
</p>
</div>
</form>
</body>
</html>
3. 代替クラス
置換コントロールを使用して、出力キャッシュされた Web ページのうち、コントロールを動的コンテンツに置き換える部分を指定します。置換コントロールは、コンテンツの大部分がキャッシュされるページの部分ページをキャッシュするための簡略化されたソリューションを提供します。ページ全体を出力キャッシュしてから、置換コントロールを使用して、キャッシュから除外するページの部分を指定できます。キャッシュする必要がある領域は 1 回だけ実行され、キャッシュ項目の有効期限が切れるかクリアされるまでキャッシュから読み取られます。動的領域は、ページが要求されるたびに実行されます。このキャッシュ モデルでは、主に静的コンテンツを含むページのコードが簡素化されます。これは、これらの部分を Web ユーザー コントロールでキャッシュするためにカプセル化する必要がないためです。たとえば、このキャッシュ モデルは、ページに静的コンテンツ (ニュース記事など) と広告を表示する AdRotator コントロールが含まれている場合に役立ちます。ニュース記事は変更されないため、キャッシュすることができます。ただし、ユーザーがページをリクエストするたびに新しい広告を表示したいとします。 AdRotator コントロールはポストキャッシュ置換を直接サポートしており、ページがキャッシュされているかどうかに関係なく、ページがポストバックされたときに新しい広告をレンダリングします。
注: 置換コントロールは、キャッシュ ページに含まれるユーザー コントロールに配置できます。ただし、出力キャッシュ ユーザー コントロール内に置換コントロールを配置することはできません。
Substitution コントロールが実行されると、文字列を返すメソッドが呼び出されます。このメソッドによって返される文字列は、ページ上の置換コントロールの位置に表示されるコンテンツです。 MethodName プロパティを使用して、置換コントロールの実行時に呼び出されるコールバック メソッドの名前を指定します。指定したコールバック メソッドは、Substitution コントロールを含むページまたはユーザー コントロールの静的メソッドである必要があります。コールバック メソッドの署名は、HttpContext パラメーターを受け取り文字列を返す HttpResponseSubstitutionCallback デリゲートの署名と一致する必要があります。
ページの出力キャッシュを操作するには、@OutputCache ディレクティブ、HttpCachePolicy クラス、または Cache プロパティを使用できます。
Substitution コントロールを使用する別の方法は、HttpResponseSubstitutionCallback デリゲートを使用してキャッシュ置換動作を実装することです。さらに、キャッシュ置換動作は、AdRotator コントロールなど、キャッシュ置換機能を直接サポートするコントロールに実装できます。
例
次のコード例は、出力キャッシュ Web ページに置換コントロールを宣言的に追加する方法を示しています。ページが読み込まれると、ユーザーのタブに現在の日付と時刻が表示されます。ページのこの領域はキャッシュされ、60 秒ごとに更新されます。 Substitution コントロールが実行されると、GetCurrentDateTime メソッドが呼び出されます。 GetCurrentDateTime によって返された文字列がユーザーに表示されます。ページのこの部分はキャッシュされず、ページが更新されるたびに更新されます。
<%@ 出力キャッシュ期間 = "60" 変化するパラメータ = "なし" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
「 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 」
<script runat="server" language="C#">
void Page_Load(オブジェクト送信者、System.EventArgs e)
{
// 現在の日付と時刻をラベルに表示します。
// 出力キャッシュはページのこのセクションに適用されます。
CachedDateLabel.Text = DateTime.Now.ToString();
}
// 置換コントロールはこのメソッドを呼び出して取得します
// ページの現在の日付と時刻。
// は出力キャッシュから除外されます。
パブリック静的文字列 GetCurrentDateTime (HttpContext コンテキスト)
{
return DateTime.Now.ToString ();
}
</script>
<html>
<head runat="サーバー">
<title>置換クラスの例</title>
</head>
<本文>
<form id="form1" runat="server">
<h3>置換クラスの例</h3>
<p>ページのこのセクションはキャッシュされません:</p>
<asp:substitution id="置換1"
メソッド名 = "GetCurrentDateTime"
runat="サーバー">
</asp:置換>
<br />
<p>ページのこのセクションはキャッシュされています:</p>
<asp:label id="CachedDateLabel"
runat="サーバー">
</asp:ラベル>
<br /><br />
<asp:button id="リフレッシュボタン"
text="ページを更新"
runat="サーバー">
</asp:ボタン>
</form>
</body>