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

6290 ワード

ページ全体をキャッシュするのは現実的ではない場合があります.各リクエストに対してページの一部を動的に作成する必要がある場合があります.これらの場合、大量のサーバリソースを必要とするページリクエストに関連付けられたオブジェクトまたはデータを識別するのに時間がかかる場合があります.これらのアイテムを識別すると、Webフォームのユーザーコントロールでこれらのアイテムを作成してページの他の部分から分離し、指定した時間にこれらのアイテムをキャッシュすることで、サーバリソースを節約できます.これが通常のクリップキャッシュです.
このテクノロジーを使用すると、作成するページの一部(データベース・クエリーなど)とページの他の部分を分離するのに貴重なプロセッサ時間がかかります.リクエストごとにサーバリソースが少ないページを動的に生成できる部分を選択できます.
キャッシュするページの部分を識別し、これらの部分の各部分をカプセル化するユーザーコントロールを作成したら、これらのユーザーコントロールのキャッシュポリシーを決定する必要があります.コード非表示クラスでユーザーコントロールを作成する場合は、@OutputCacheコマンドを使用してポリシーを宣言的に設定するか、PartialCachingAttributeクラスを使用してこれらのポリシーをプログラミング的に設定できます.
たとえば、次のコマンドがユーザーコントロールファイルの上部に含まれている場合、コントロールのバージョンは出力キャッシュに120秒格納されます.
<%@ OutputCache Duration="120" VaryByParam="None" %>

同様に、コード非表示開発メソッドを使用してユーザーコントロールを開発する場合、次のプロパティをクラス宣言メタデータに含めると、コントロールバージョンは出力キャッシュに120秒格納されます.
[C#]

[PartialCaching(120)]

[Visual Basic]

<PartialCaching(120)>

これらのテクノロジーのいずれかを使用すると、ユーザーコントロールを含むページが要求されると、ユーザーコントロールのみがキャッシュされます.
注意出力キャッシュに指定するユーザーコントロールをページに宣言して使用した場合、ASP.NETページアナライザは、ユーザーコントロールの作成方法に基づいて、2つのオブジェクトタイプの1つをインスタンス化します.宣言でユーザーコントロールを作成すると、
StaticPartialCachingControlオブジェクト;使用する場合
LoadControlメソッドはプログラミングでユーザーコントロールを作成し、追加します.
PartialCachingControlオブジェクト.したがって、ページが要求されると、ページがキャッシュされていない場合、アナライザは、ページのコントロール階層に占めるユーザーコントロールの論理的な位置にオブジェクトを配置します.
ページ出力で設定できるプロパティの詳細については、@OutputCacheコマンドの関連ドキュメントを参照してください.ユーザーコントロールの開発方法の詳細については、Webフォームのユーザーコントロールを参照してください.
注意:ページ上の他のサーバコントロールにユーザーコントロールをネストすることもできるので、出力キャッシュに格納されたユーザーコントロールをネストすることもできます.これは、出力キャッシュ・ページ内のユーザー・コントロールに出力キャッシュ・コマンドを含めるか、別の出力キャッシュ・ユーザー・コントロールの一部であるユーザー・コントロールに含めることができることを意味します.

クリップキャッシュの使用時によくあるエラー


出力キャッシュに指定されたユーザーコントロールタグにID属性を宣言することで、そのユーザーコントロールのインスタンスをプログラミングできます.ただし、コードを正常に動作させるには、出力キャッシュにユーザーコントロールが存在することを明示的に検証する必要があります.
例えば、ユーザコントロールのID(MyUserControl)に宣言的に割り当てる場合、含まれるものを用いることができる.aspxファイルのコード宣言ブロックの次のコードは、ユーザーコントロールが存在するかどうかを確認します.
[C#]

void Page_Load() {

    if (MyUserControl != null)

       // Place code manipulating MyUserControl here.

}

[Visual Basic]

Sub Page_Load()

    If MyUserControl <> Null Then

       ' Place code manipulating MyUserControl here.

    End If  

End Sub

@OutputCacheコマンドを含むユーザーコントロールを操作するコードを作成すると、エラーが発生します.最初のリクエストに対して出力キャッシュされたユーザーコントロールのみを動的に生成します.指定した時間が期限切れになる前に、出力キャッシュからすべての後のリクエストが満たされます.ユーザー・コントロールがインスタンス化されていると判断すると、含まれているページからユーザー・コントロールをプログラミングで操作できます.このロジックは、Page_などのユーザーコントロールに関連付けられたページ生存イベントに含めることができます.LoadイベントまたはPage_Prenderイベント中です.
また、出力キャッシュ設定のあるユーザーコントロールが、出力キャッシュ設定のあるWebフォームページに存在する場合にも注意してください.ページ出力キャッシュストレージの持続時間がユーザーコントロール出力キャッシュストレージの持続時間よりも長い場合、ページ出力キャッシュストレージの持続時間は、ユーザーコントロールを含むページ全体に有効です.たとえば、ページ出力キャッシュが100秒に設定され、ユーザーコントロール出力キャッシュが50秒に設定されている場合、ページ全体は、ユーザーコントロールの短い時間設定に関係なく、出力キャッシュに100秒格納されます.次の例では、この点について説明します.
page01.aspx
[C#]

<%@ Page language="C#" %>

<%@ Register tagprefix="myControl" tagname="Time" src="uc01.ascx" %>

<%@ OutputCache duration="100" varybyparam="none" %>



<myControl:Time runat="server" /><br> <br> <br>



This page was most recently generated at:<p>



 <% DateTime t = DateTime.Now; 

    Response.Write(t); %>

[Visual Basic]

<%@ Register tagprefix="myControl" tagname="Time" src="uc01.ascx" %>

<%@ OutputCache duration="100" varybyparam="none" %>



<myControl:Time runat="server" /><br> <br> <br>



This page was most recently generated at:<p>

 <% Dim t As DateTime = DateTime.Now

Response.Write(t) %>

uc01.ascx
[C#]

<% @Control language="C#" %>

<% @OutputCache duration="100" varybyparam="none" %>



This user control was most recently generated at:<p>



<% DateTime t = DateTime.Now; 

    Response.Write(t); %>

[Visual Basic]

<% @OutputCache duration="100" varybyparam="none" %>



This user control was most recently generated at:<p>

<% Dim t As DateTime = DateTime.Now

Response.Write(t) %>

ただし、ページ出力キャッシュストレージの持続時間がユーザーコントロールストレージの持続時間より短い場合は、ページの残りの部分がリクエストの再生成された場合でも、キャッシュユーザー出力コントロールは、そのストレージ時間が期限切れになるまで使用されます.たとえば、ページ出力キャッシュが50秒に設定され、ユーザーコントロール出力キャッシュが100秒に設定されている場合、ページの残りの部分が2回期限切れになるたびに、ユーザーコントロールは1回期限切れになります.以下の簡単な例では、この点を説明します.
page02.aspx
[C#]

<%@ Page language="C#" %>

<%@ Register tagprefix="myControl" tagname="Time" src="uc02.ascx" %>



<%@ OutputCache duration="50" varybyparam="none" %>



<myControl:Time runat="server" /><br> <br> <br>



This page was most recently generated at:<p>



 <% DateTime t = DateTime.Now; 

    Response.Write(t); %>

[Visual Basic]

<%@ Register tagprefix="myControl" tagname="Time" src="uc02.ascx" %>

<%@ OutputCache duration="50" varybyparam="none" %>



<myControl:Time runat="server" /><br> <br> <br>



This page was most recently generated at:<p>

 <% Dim t As DateTime = DateTime.Now

Response.Write(t) %>

uc02.ascx
[C#]

<% @Control language="C#" %>

<% @OutputCache duration="100" varybyparam="none" %>



This user control was most recently generated at:<p>



<% DateTime t = DateTime.Now; 

    Response.Write(t); %>

[Visual Basic]

<% @OutputCache duration="100" varybyparam="none" %>



This user control was most recently generated at:<p>

<% Dim t As DateTime = DateTime.Now

Response.Write(t) %>