ASP.NET 徹底活用術のホームへ戻る

Webページ全体をキャシングする

 

● 無条件にWebページをキャッシング ~OutputCache1.aspx

 

Webページには、社員マスタのように比較的更新頻度が少ないデータを表示するものが少なくありません。このような場合、ASP.NETのキャッシング機能を使用することによりWebページの表示を高速化することができます。

 

ASP.NETWebページをキャッシングするには、Webページの先頭に@OutputCacheディレクティブを追加します。たとえば、Webページを10秒間キャッシングさせるには、次のように記述します。

 

<%@ OutputCache Duration=”10” VarByParam=”none” %>

 

Durationには、Webページをキャッシングする時間を秒単位で指定します。VaryByParamには、「none」またはクエリ文字列(QueryString)の変数名を指定します。なお、クエリ文字列の使い方については後述します。

 

1のようにブラウザを起動してサンプル(OutputCache1.aspx)を表示すると、Webページに「現在の日時」が表示されます。このサンプルのPage_Loadイベントハンドラでは、DateTimeオブジェクトのNowプロパティからWebサーバーの日付と時刻を取得してLabelTextプロパティに設定して表示します。

 

@OutputCacheディレクティブを指定すると、ブラウザの[更新]ボタンをクリックしてWebページをリロードしても、キャッシングされているWebページが表示されて日時が更新されません。10秒後に、ブラウザの[更新]ボタンをクリックすると、キャッシングが無効になって日時が更新されます。

 

 

1@OutputCacheディレクティブを指定するとブラウザの[更新]ボタンをクリックしても「現在の日時」が更新されない

 

 

 

リスト1@OutputCacheディレクティブを追加してページ全体をキャッシング (OutputCache1.aspx)

 

<%@ Page Language="VB" %>

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

<script runat="server">

    Sub Page_Load(Sender As Object, E As EventArgs)

      Label1.Text = DateTime.Now.ToString()

    End Sub

</script>

<html>

<body>

    <h3>ページレベルのキャッシュ(その1)</h3>

    現在の日時:<asp:Label id="Label1" runat="server"></asp:Label>

</body>

</html>

 

● 条件付でWebページをキャッシング ~OutputCache2.aspx

 

2のサンプルは、WebページにDataGridiframeを配置しています。左側のDataGridには、商品区分テーブルから商品区分IDと商品区分名を表示します。商品区分名のハイパーリンクをクリックするとOutputCache2Products.aspxがロードされてiframeに商品区分に該当する商品名が表示されます。

 

<asp:DataGrid id="DataGrid1" runat="server" ...>

  <Columns>

    <asp:BoundColumn DataField="CategoryID" HeaderText="ID">

    </asp:BoundColumn>

    <asp:HyperLinkColumn Target="productFrame"

      DataNavigateUrlField="CategoryID"

      DataNavigateUrlFormatString="OutputCache2Products.aspx?CategoryID={0}"

      DataTextField="CategoryName" HeaderText="商品区分名">

    </asp:HyperLinkColumn>

  </Columns>

</asp:DataGrid>

・・・

<iframe id="productFrame" name="productFrame" ...>

</iframe>

 

 

OutputCache2Products.aspxをロードするとき、「?CategoryID=1」のようなクエリ文字列を指定して商品区分IDを渡します。たとえば、「調味料」のハイパーリンクをクリックしたときは「OutputCache2Products.aspx?CategoryID=2」のようなクエリ文字列が渡ります。OutputCache2Products.apxは、クエリ文字列から商品区分IDを取得してDataGridに該当する商品名を表示します。このとき、@OutputCacheディレクティブに「VaryByParam=”none”」を指定すると、キャッシングされている別の商品区分の商品名が表示されてしまいます。

 

この不都合を回避するには、「VaryByParam=”CategoryID”」のようにクエリ文字列の変数名を指定します。この場合、キャッシングされているWebページの商品区分IDと新たに要求したWebページの商品区分IDが一致するときのみキャッシングが有効になります。

 

 

2:クエリ文字列の商品区分IDが一致するときのみキャッシュが有効になる

 

リスト2@OutputCacheVaryByParamにクエリ文字列の変数名を指定 (OutputCache2Products.aspx)

<%@ Page Language="VB" %>

<%@ OutputCache Duration="10" VaryByParam="CategoryID" %>

・・・

<script runat="server">

    Sub Page_Load(sender As Object, e As EventArgs)

      Dim strCategoryID As String = Request.Params("CategoryID")

      If Not IsPostBack Then

        BindGrid(strCategoryID)

      End If

    End Sub

   

    Sub BindGrid(strCategoryID)

      Dim strSQL As String = "Select * From Products " & _

        "Where CategoryID=" & strCategoryID

      With DataGrid1

        .DataSource = CreateDataReader(strSQL)

        .DataBind()

      End With

    End Sub

    ・・・

</script>

 

ASP.NET 徹底活用術のホームへ戻る