次の方法で共有


方法 : キャッシュされたページの有効性をチェックする

更新 : 2007 年 11 月

ユーザーがキャッシュされたページを要求すると、ASP.NET は、ページに定義されたキャッシュ ポリシーに基づいて、キャッシュされた出力がまだ有効かどうかを判断します。その出力が有効な場合、キャッシュされた出力がクライアントに送信され、ページの再処理は行われません。ただし、ページが有効かどうかをチェックするカスタム ロジックを記述できるように、ASP.NET には、この検証チェック時に検証コールバックを使用してコードを実行する機能が用意されています。検証コールバックを使用すると、キャッシュの依存関係を使用する通常のプロセスの範囲外にあるキャッシュされたページを無効化できます。

キャッシュされたページの有効性をプログラムでチェックするには

  1. 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
    
  2. ページのライフ サイクル イベントの 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
    

参照

概念

ASP.NET ページのキャッシュ