2011-01-26 9 views
2

ASP.NETでサーバー上のキャッシュされたページをプログラムで無効にする方法と、本(MCTS Self-Paced Traing Kit(Exam 70 -515は)」)と言う:ASP.NETキャッシュ - プログラムでサーバーキャッシュを無効にする...混乱例

直接ページのキャッシュ バージョンが使用されているかどうかを制御するか、ページが動的に生成されるかどうか 、ValidateCacheOutput イベントに 応答と に有効な値を設定するにはHttpValidationStatus属性。

コードセグメントは、次のようになります。

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; 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Cache.AddValidationCallback(
     new HttpCacheValidateHandler(ValidateCacheOutput), 
     null); 
} 

誰かがこのコードが何をしているか私に説明してもらえますか?また、私が持っている主な質問は、私はキャッシュされたページが単にサーバーから返されたと考えているが、以下のコードはページのライフサイクルが呼び出されていることを示している(Page_Loadイベント)。キャッシュされたページが返された場合、ページのライフサイクルが呼び出されないので、私は混乱しています。そのため、Page_Loadイベントのコードはどのように起動しますか?

注:ここでsame exampleは、あなたがその一般的にキャッシュされたページで正しいブックが

答えて

1

を持っていることをちょうどサーバーFRM返されたが、あなたはAddValidationCallbackを使用する場合、これは変更されています。この場合、ASP.NETはこのメソッドを呼び出して、キャッシュされたコピーを返すかどうかを判断します。したがって、このメソッドは非常に軽いか、キャッシングの効果を無効にします。

ステータス変数のクエリ文字列をチェックし、この値を使用して(1)キャッシュからページをプルするか、(2)キャッシュされたページをクリアするか、再レンダリングするかそれをキャッシュするか、(3)キャッシュを無視してページを再レンダリングするだけです。

ステータスオプションについては、http://msdn.microsoft.com/en-us/library/system.web.httpvalidationstatus.aspxを参照してください。

2

私もこの質問に出会った。私がこの主題に関して見つけたほぼすべてのブログ投稿と記事が、実際にどのように動作するのかを説明することなく、忠実にMSDN exampleを複製するのは残念です。

私は明確な答えはありませんが、これはページのライフサイクルが少なくとも1回呼び出されるため、これが機能すると思います。つまり、ページが初めて要求されたため、まだキャッシュされていません。 最初の要求中にPage_Loadが呼び出され、HttpCacheValidateHandlerがCacheオブジェクトに登録されます。そのページに対するその後のすべての要求中に、CacheオブジェクトはValidateCacheOutput()メソッドを呼び出すことができます。また、このメソッドがstaticであるため、ページのライフサイクルを呼び出す必要はありません。

私はこれについての詳細を知っている人がそれにコメントすることができますことを願っていますが、私の意見では、これはまた、次のことを意味します:与えられた例では

  1. HttpCacheValidateHandlerがの静的メソッドである必要はありません。これは、Pageオブジェクトのプロパティを使用していないためです。それはあなたが好きな他のオブジェクトの静的メソッドにすることができます。
  2. Response.Cache.AddValidationCallback()を呼び出すために(ab)ページだけでなく、すべてのページ要求に対してValidateCacheOutput()メソッドが呼び出される可能性があります。たぶん私は何かが明らかに欠けているが、どのようにHttpCacheValidateHandlerがどのページに属しているかをキャッシュがどのように知っているかわからない。
関連する問題