ASP.NETページローカルキャッシュ

29136 ワード

ページ全体をキャッシュするのは現実的ではない場合があります.ページの一部は、要求されるたびに変化する可能性があります.これらの場合、ページの一部しかキャッシュできません.名前の通り、ページ部分キャッシュは、ユーザの要求に応答するためにページ部分のコンテンツをメモリに保存し、ページの他の部分のコンテンツは動的コンテンツである.ページ部分キャッシュの実装には、コントロールキャッシュと置換後キャッシュの2つの方法があります.
  1. コントロールキャッシュ(クリップキャッシュとも呼ばれる)
このようにすると、キャッシュする必要がある情報を1つのユーザコントロールに含め、そのユーザコントロールをキャッシュ可能としてマークし、ページ出力の一部をキャッシュすることができる.このオプションを使用すると、ページ全体をキャッシュせずにページ内の特定のコンテンツをキャッシュできます.そのため、ページ全体を毎回再作成する必要があります.たとえば、株式情報などの大量の動的コンテンツを表示するページを作成し、一部が静的コンテンツ(週次要約など)である場合、静的部分をユーザーコントロールに配置し、これらのコンテンツをキャッシュできます.
ASP.NETでは、UserControlというユーザーコントロールの機能を提供しています.1ページは複数のUserControlで構成できます.キャッシュを1つまたは複数のUserControlに設定するだけです.
例:
ではWebUserControl.ascxのヘッダーコードに宣言文を追加します.
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs"

    Inherits="WebApplication2.WebUserControl1" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<%=DateTime.Now %> 

コントロールのページを呼び出すaspxコード:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication2.WebForm2" %>

<%@ Register Src="~/WebUserControl1.ascx" TagName="WebUserControl1" TagPrefix="uc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <div><%=DateTime.Now %>

        </div>

        <div><uc1:WebUserControl1 ID="WebUserControl11" runat="server" />

        </div>

    </div>

    </form>

</body>

</html>

WebForm 1を更新します.aspxページの場合、ページの時間はリフレッシュするたびに変化しますが、ユーザーコントロールの時間データは60秒に1回しか変化しません.ページの「ローカル」コントロールにキャッシュが実現され、ページ全体に影響を与えないことを示します.
2.キャッシュ後置換
コントロールキャッシュとは正反対です.ページ全体をキャッシュしますが、ページの一部のクリップはダイナミックなので、キャッシュされません.ASP.NETページには静的コンテンツとデータベースデータに基づく動的コンテンツが含まれています.静的コンテンツは通常変化しません.したがって,静的コンテンツのデータキャッシュを実現する必要がある.しかしながら、データベースの動的コンテンツは異なる.データベース内のデータは刻々と変化する可能性があります.そのため、ダイナミックコンテンツに対してもキャッシュが実現されると、データがタイムリーに更新されないという問題が発生する可能性があります.この問題に対して、前述したコントロールキャッシュ方法を使用すると、明らかに現実的ではなく、実装が煩雑で、エラーが発生しやすい.
ページの一部のクリップをキャッシュせずに、ページの大部分のコンテンツをキャッシュする方法.ASP.NET 2.0はキャッシュ後置換機能を提供している.この機能を実現するには、次の3つの方法があります.
1つは、Substitutionコントロールを宣言的に使用することです.
二つ目は、SubstitutionコントロールAPIをプログラミングで使用することである.
3つ目は、コントロールを暗黙的に使用することです.
最初の2つの方法の核心はSubstitutionコントロールで、このセクションではこのコントロールに重点を置いて説明します.3つ目の方法は、コントロールにサポートされているキャッシュ後の置換機能のみに焦点を当てています.このセクションでは簡単に説明します.
(1)Substitutionコントロール応用
アプリケーションのパフォーマンスを向上するために、ASP全体をキャッシュする場合がある.NETページは、各リクエストに応じてページ上の特定の部分を更新する必要がある場合があります.たとえば、ページの大部分をキャッシュする場合は、ページの時間またはユーザーの高さに関する情報を動的に更新する必要があります.この場合、Substitutionコントロールの使用を推奨します.Substitutionコントロールは、ページ出力キャッシュでコントロールを動的に置き換える必要がある部分を指定します.つまり、ページ全体の出力キャッシュを許可し、Substitutionコントロールを使用してページ内のキャッシュを免除する部分を指定します.キャッシュが必要な領域は1回のみ実行され、キャッシュ・アイテムが期限切れになるかクリアされるまでキャッシュから読み出されます.ダイナミック領域、すなわちSubstitutionコントロールで指定された部分は、ページを要求するたびに実行されます.Substitutionコントロールは、ページの一部をキャッシュするシンプルなソリューションを提供します.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication2.WebForm2" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <div><%=DateTime.Now %>

        </div>

        <div>

             Substitution         :<asp:Substitution ID="Substitution1" runat="server" MethodName="getCurrentTime" />

        </div>

    </div>

    </form>

</body>

</html>
using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



namespace WebApplication2

{

    public partial class WebForm2 : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

        }

        public static string getCurrentTime(HttpContext context) 

        { 

            return DateTime.Now.ToString(); 

        }

    }

}

上記のコードに示すように、Substitutionコントロールには、MethodNameという重要なプロパティがあります.この属性は、Substitutionコントロールが実行されたときにコールバックのために呼び出されるメソッド名を取得または設定するために使用されます.この方法は比較的特殊で、以下の3つの基準を満たさなければならない.
Øこのメソッドは静的メソッドとして定義する必要があります.
Øこの方法はHttpContextタイプのパラメータを受け入れなければならない.
ØこのメソッドはStringタイプの値を返す必要があります.
実行すると、SubstitutionコントロールはMethodNameプロパティで定義されたメソッドを自動的に呼び出します.このメソッドが返す文字列は、ページ内のSubstitutionコントロールの位置に表示される内容です.ページにキャッシュのすべての出力が設定されている場合、最初のリクエスト時にページが実行され、出力がキャッシュされます.後続のリクエストについては、キャッシュによって完了し、ページの他のコードは実行されません.しかし、Substitutionコントロールとその関連方法は、要求されるたびに実行され、そのコントロールが表す動的な内容が自動的に更新され、全体的なキャッシュ、局所的な変化の置換効果を実現します.
以上のように,コードヘッダに@OutputCache命令でページ出力キャッシュの有効期限を5秒に設定することで,ページデータ全体にキャッシュ機能が適用されることを意味する.したがって、ページキャッシュの時間(Page Cache Time)に表示される時間値は、データキャッシュから取得されます.この時間値は、ページのリフレッシュに伴って変化せず、キャッシュが期限切れになった場合にのみ更新されます.SubstitutionコントロールのMethodNameプロパティの値はgetCurrentTimeです.このコントロールにはgetCurrentTimeメソッドの戻り値が表示されます.特に重要なのは、ページに出力キャッシュ機能が設定されているが、ページがリフレッシュされるたびにASP.NET実行エンジンは、Substitutionコントロールを再実行し、MethodName属性値で指定したメソッド戻り値をページに表示するため、現在の最新時刻を表示します.
ページがリフレッシュされるにつれて、実際の時間は変わりますが、ページキャッシュの時間は指定したキャッシュ時間内に常に変わりません.
注意:
ØSubstitutionコントロールは、ページ上の他のコントロールにアクセスできません.つまり、他のコントロールの値をチェックまたは変更することはできません.ただし、コードは、渡されたパラメータを使用して現在のページコンテキストにアクセスできます.
Øキャッシュ・ページに含まれるユーザー・コントロールにSubstitutionコントロールを含めることができます.ただし、Substitutionコントロールは出力キャッシュユーザコントロールには配置できません.
ØSubstitutionコントロールにはタグは表示されません.その位置に表示される内容は、定義されたメソッドの戻り文字列に完全に依存します.
(2)SubstitutionコントロールAPI応用
前のセクションでは、Substitutionコントロールを使用してキャッシュ後の置換を宣言するアプリケーションについて説明しました.このセクションでは、別の実装方法について説明します.この方法の核心は,SubstitutionコントロールAPIをプログラム的に利用してキャッシュ後置換を実現することであり,Substitutionコントロールを宣言的に使用する方法よりも柔軟性が高い.
Substitutionにコールバックメソッドを指定することで、宣言と同様の効果が得られます.Substitutionのコールバック方法は
HttpResponseSubstitutionCallbackが定義を依頼する方法で、2つの特徴があります.
Ø1は戻り値がStringでなければなりません.
Ø2は、パラメータが1つしかなく、HttpContextタイプです.
プログラミング方式でキャッシュされた出力応答に対して指定された応答領域を動的に生成する必要がある場合、ページコードにおいて、あるメソッド(すなわちコールバックメソッド)の名前をパラメータとしてSubstitutionCallbackに渡すことができる.これによりSubstitutionはコールバックメソッドを用い,コールバックメソッドの戻り値を所定の位置の代替内容として表示することができる.
コールバックメソッドは、スレッドが安全でなければならないことに注意してください.コンテナとしてのページまたはユーザーコントロールの静的メソッドであってもよいし、他の任意のオブジェクトの静的メソッドまたはインスタンスメソッドであってもよい.
次に、出力キャッシュページにSubstitutionコントロールをプログラミングで追加する方法を示します.(1)Substitutionコントロールアプリケーションに示す例と同様の機能を果たす.違うのは実現方式です.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication2.WebForm2" %>

<%@ OutputCache Duration="60" VaryByParam="none" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <div><%=DateTime.Now %>

        </div>

        <div>

             Substitution  API     :<asp:PlaceHolder ID="PlaceHolder1" runat="Server"></asp:PlaceHolder>

        </div>

    </div>

    </form>

</body>

</html>
using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;



namespace WebApplication2

{

    public partial class WebForm2 : System.Web.UI.Page

    {

        protected void Page_Load(object sender, EventArgs e)

        {

            //    Substitution    

            Substitution Substitution1 = new Substitution();    

            //              

            Substitution1.MethodName = "getCurrentTime";              

            PlaceHolder1.Controls.Add(Substitution1);           

        }

        public static string getCurrentTime(HttpContext context) 

        { 

            return DateTime.Now.ToString(); 

        }

    }

}

上記コードに示すように、ページには@OutputCacheコマンドを使用して出力キャッシュ機能が設定されており、データキャッシュの有効期限は60秒です.しかし、ページの他のコンテンツはキャッシュされ、Substitutionによって呼び出されたコールバックメソッドによって表示されるコンテンツはキャッシュされない.