@ 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 アプリケーションのパフォーマンスを改善する
プロキシキャッシュ対策
ブラウザキャッシュでパフォーマンス向上