方法 : キャッシュされたページの有効性をチェックする
更新 : 2007 年 11 月
ユーザーがキャッシュされたページを要求すると、ASP.NET は、ページに定義されたキャッシュ ポリシーに基づいて、キャッシュされた出力がまだ有効かどうかを判断します。その出力が有効な場合、キャッシュされた出力がクライアントに送信され、ページの再処理は行われません。ただし、ページが有効かどうかをチェックするカスタム ロジックを記述できるように、ASP.NET には、この検証チェック時に検証コールバックを使用してコードを実行する機能が用意されています。検証コールバックを使用すると、キャッシュの依存関係を使用する通常のプロセスの範囲外にあるキャッシュされたページを無効化できます。
キャッシュされたページの有効性をプログラムでチェックするには
HttpCacheValidateHandler 型のイベント ハンドラを定義し、キャッシュされたページ応答の有効性をチェックするコードを組み込みます。
検証ハンドラは、次のいずれかの HttpValidationStatus 値を返す必要があります。
Invalid キャッシュされたページが無効であることを示します。ページはキャッシュから削除済みであり、要求はキャッシュ内でヒットするページがないものとして処理されます。
IgnoreThisRequest 要求はキャッシュ内でヒットするページがないものとして処理されます。このため、ページがもう一度処理されますが、キャッシュされたページは無効化されません。
Valid キャッシュされたページが有効であることを示します。
クエリ文字列変数 status に値 "invalid" または "ignore" が格納されているかどうかを判断する、ValidateCacheOutput という名前の検証ハンドラのコード例を次に示します。ステータス値が "invalid" の場合、メソッドが Invalid を返し、キャッシュ内のページが無効化されます。ステータス値が "ignore" の場合、メソッドが IgnoreThisRequest を返し、ページはキャッシュに残されますが、この要求に対して新しい応答が生成されます。
public static void ValidateCacheOutput(HttpContext context, Object data, ref HttpValidationStatus status) { if (context.Request.QueryString["Status"] != null) { string pageStatus = context.Request.QueryString["Status"]; if (pageStatus == "invalid") status = HttpValidationStatus.Invalid; else if (pageStatus == "ignore") status = HttpValidationStatus.IgnoreThisRequest; else status = HttpValidationStatus.Valid; } else status = HttpValidationStatus.Valid; }
Public Shared Sub ValidatePage(ByVal context As HttpContext, _ ByVal data As [Object], ByRef status As HttpValidationStatus) If Not (context.Request.QueryString("Status") Is Nothing) Then Dim pageStatus As String = context.Request.QueryString("Status") If pageStatus = "invalid" Then status = HttpValidationStatus.Invalid ElseIf pageStatus = "ignore" Then status = HttpValidationStatus.IgnoreThisRequest Else status = HttpValidationStatus.Valid End If Else status = HttpValidationStatus.Valid End If End Sub
ページのライフ サイクル イベントの 1 つ (ページの Load イベントなど) から AddValidationCallback メソッドを呼び出し、手順 1 で定義したイベント ハンドラの最初の引数として渡します。
ValidateCacheOutput メソッドを設定して検証ハンドラにするコード例を次に示します。
protected void Page_Load(object sender, EventArgs e) { Response.Cache.AddValidationCallback( new HttpCacheValidateHandler(ValidateCacheOutput), null); }
Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load Response.Cache.AddValidationCallback( _ New HttpCacheValidateHandler(AddressOf ValidatePage), Nothing) End Sub