6

ASP.NETOutputCacheメカニズムを理解しようとしています。
LabelとLinkBut​​tonを使用してテストページを作成しました。
ラベルテキストは、すべてのPageLoadの現在のサーバー日付でサーバー上で初期化されています。

protected void Page_Load(object sender, EventArgs e)  
{  
    lblDate.Text = DateTime.Now.ToString();  
}

私はこのディレクティブを使用しました:<%@ OutputCache Duration="600" VaryByParam="none"%>

初めてLinkBut​​tonを押すと、ラベルに新しいテキストが表示されますが、もう一度リンクボタンを押すと、新しいテキストが表示されません。

これは、ポストバックごとに同じであるサーバーに転送されているパラメーターが原因であると思います。

OutputCachおよびポストバックコントロールを操作する方法はありますか?

4

3 に答える 3

7

そうです、パラメータなしで変化しているので、最初のリクエストの応答htmlがキャッシュされ、次の10分間(理論的には)提供されます。GETをキャッシュしたいが、異なるPOSTを処理したい場合は、POSTパラメーターによって異なる必要があります。

例を挙げましょう。POSTの内容を含む電子メールを送信するために使用されるテキスト入力があります。その入力名によって異なる場合、そのテキスト入力の値が異なるキャッシュ期間内の各リクエストは、ハンドラーにヒットし、電子メールの送信を処理します。

反対側では、*によって異なる可能性がありますが、その場合、カーネルモードのキャッシュが失われます。

于 2009-07-21T15:34:47.997 に答える
3

あなたはあなたの仮定において正しいです。

OutputCacheディレクティブは、レンダリングされたページ全体を特定のURLに対して600秒間キャッシュするように、出力キャッシュメカニズムに指示しています。

単純な例では、おそらくクエリ文字列を使用していませんが、ディレクティブ内のVaryByParam宣言を使用すると、クエリ文字列パラメーターを指定して、そのパラメーターの異なる値が個別にキャッシュされるようにすることができます。たとえば、次の場合:

<%@ OutputCache Duration="600" VaryByParam="ProductID"%>

次に、これら3つの異なるURLはそれぞれ個別にキャッシュされ、「ProductID」パラメーターの値をまだキャッシュされていない値に変更すると、ページがASP.NETランタイムによって正しく処理およびレンダリングされるようになります。

http://www.example.com/viewproduct.aspx?ProductID=123
http://www.example.com/viewproduct.aspx?ProductID=3
http://www.example.com/viewproduct.aspx?ProductID=67

この例では、ボタンをクリックすると、ページは既にレンダリング(およびキャッシュ)されており、再度投稿しても、投稿先のURLに違いはなく、効果的に再読み込みされます。したがって、ASP.NETランタイム再レンダリングのプロセスを経ることなく、キャッシュされたページを表示します。

「VaryByParam」パラメーターの値を変更する以外に、OutputCacheディレクティブは、ページキャッシングに対するかなりの「オールオアナッシング」アプローチです。ディレクティブには「VaryByContol」属性がありますが、これは完全なASP.NET Webページではなく、ASP.NETユーザーコントロールでのみ使用できます。

あなたの質問から、それはあなたが部分的なページキャッシングを調査する必要があるように聞こえます。それか、何らかのイベントが発生したときにキャッシュを無効にするメカニズムのいずれか。これは通常、「キャッシュ依存関係」を追加することによって行われます。

そのためには、次のリンクが役立ちます。

ASP.NETページの一部のキャッシュ
ヒント/コツ:ASP.NET 2.0出力キャッシュ置換機能を使用して「ドーナツキャッシング」を実装し、
プログラムで出力キャッシュからページを削除します

于 2009-07-21T15:16:07.643 に答える
0

必要なのは、キャッシュ後の置換です。

キャッシュされたページの一部を動的に更新する

于 2009-07-21T15:15:24.367 に答える