WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

@OutputCache ディレクティブ

by WebSurfer 2012年4月28日 16:50

@ OutputCache ディレクティブ を使ったキャッシュの設定方法は、MSDN ライブラリなどを検索するといろいろ見つかりますが、結局読んでもよく分かりません。(笑)

という訳で、実際にコードを書いて試して見ました。今回調べたのは Location 属性の設定によってどう変わるかということです。いろいろ発見があったので、忘れないように書いておきます。

まず、@ OutputCache ディレクティブを設定しない場合ですが、その場合はサーバーではキャッシュされません。

応答ヘッダは以下のようになりますので、コンテンツはブラウザのユーザー専用キャッシュにのみキャッシュされます。

Cache-Control: private
Date: Sat, 28 Apr 2012 01:44:22 GMT

ただし、ASP.NET ページには有効期限がないため、キャッシュは常に古いと見なされます。そのため、ASPX リソースをリクエストすると、ページがキャッシュされてない場合と同じように、常にサーバーから新しいリソースを取得することになります。

次に、例として、@ OutputCache ディレクティブを以下のように設定した場合、キャッシュがどのように設定されるかを書きます。

<%@ OutputCache 
    Duration="15" 
    Location="xxxxx" 
    VaryByParam="None" %>

Location 属性の xxxxx のところには、None, Client, Downstream, Server, ServerAndClient, Any(デフォルト)のいずれかを指定します。結果はそれぞれ以下のようになります。

(1) None

ブラウザ、プロキシ、サーバーいずれでもキャッシュされません。

ブラウザおよびプロキシにキャッシュの方法を指示する HTTP 応答ヘッダは以下のようになります。

Cache-Control: no-cache
Date: Sat, 28 Apr 2012 01:45:43 GMT
Expires: -1
Pragma: no-cache

なお、Duration と VaryByParam は必須属性ですが、Location="None" と設定してあると Duration を設定しなくてもエラーにはなりません。逆に、Duration が設定してあっても無視されるようです。

(2) Client

ブラウザのみでキャッシュされます。サーバーではキャッシュされません。

応答ヘッダは以下のようになります。

Cache-Control: private, max-age=15
Date: Sat, 28 Apr 2012 02:49:17 GMT
Expires: Sat, 28 Apr 2012 02:49:32 GMT

(3) Downstream

ブラウザおよびプロキシ(もしあれば)のみでキャッシュされます。サーバーではキャッシュされません。

応答ヘッダは以下のようになります。

Cache-Control: public, max-age=15
Date: Sat, 28 Apr 2012 02:56:09 GMT
Expires: Sat, 28 Apr 2012 02:56:24 GMT

(4) Server

サーバーのみでキャッシュされます。Duration 属性に指定した時間が経過すると、キャッシュは破棄されます。その後に要求を受けると、その応答コンテンツが再びキャッシュされます。

応答ヘッダは以下のようになりますので、ブラウザとプロキシではキャッシュされません。

Cache-Control: no-cache
Date: Sat, 28 Apr 2012 02:28:31 GMT
Expires: -1
Pragma: no-cache

なお、サーバーキャッシュは GET 用と POST 用の 2 種類生成されることに注意してください。下に示した検証用のコードで、Duration を十分長い時間にとって、GET で要求した時と、POST で要求した時とで、ラベルに表示される時間を比較してみてください。違う値になるはずです。

(5) ServerAndClient

サーバーとブラウザでキャッシュされます。

応答ヘッダは以下のようになります(Client の場合と同様)。

Cache-Control: private, max-age=15
Date: Sat, 28 Apr 2012 02:37:17 GMT
Expires: Sat, 28 Apr 2012 02:37:32 GMT

(6) Any

ブラウザ、プロキシ、サーバーのすべてでキャッシュされます。

応答ヘッダは以下のようになります(DownStream の場合と同様)。

Cache-Control: public, max-age=15
Date: Sat, 28 Apr 2012 02:18:21 GMT
Expires: Sat, 28 Apr 2012 02:18:36 GMT

なお、Location 属性はデフォルトで Any ですので、Location="Any" を削除しても結果は同じになります。

上に述べた、検証に使ったコードは以下の通りです。

<%@ Page Language="C#" %>
<%@ OutputCache Duration="3600" 
    Location="Server" 
    VaryByParam="None" %> 

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

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = DateTime.Now.ToString();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" 
            runat="server" 
            Text="Button" />
        <asp:Label ID="Label1" runat="server">
        </asp:Label>
    </div>
    </form>
</body>
</html>

最後に、今回参考にしたキャッシュ関係の記事のリンクを張っておきます。

Web 2.0 アプリケーションのパフォーマンスを改善する

プロキシキャッシュ対策

ブラウザキャッシュでパフォーマンス向上

Tags:

Cache

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年3月  >>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

View posts in large calendar