カスタム IHttpHandler を作成しているときに、HttpCachePolicy オブジェクトに関して予期しない動作に遭遇しました。
私のハンドラーは、エンティティ タグを計算して設定します (現在の応答オブジェクトに関連付けられた HttpCachePolicy で SetETag メソッドを使用します)。SetCacheability メソッドを使用してキャッシュ コントロールを public に設定すると、すべてが魅力的に機能し、サーバーは e-tag ヘッダーに沿って送信します。プライベートに設定すると、e-tag ヘッダーは抑制されます。
十分に調べていないだけかもしれませんが、HTTP/1.1 仕様には、この動作を正当化するものは何もありません。プロキシがデータを保存することを禁止しながら、ブラウザに E-Tag を送信したくないのはなぜですか?
using System;
using System.Web;
public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext ctx) {
ctx.Response.Cache.SetCacheability(HttpCacheability.Private);
ctx.Response.Cache.SetETag("\"static\"");
ctx.Response.ContentType = "text/plain";
ctx.Response.Write("Hello World");
}
public bool IsReusable { get { return true; } }
}
戻ります
キャッシュ制御: プライベート コンテンツ タイプ: テキスト/プレーン。文字セット=utf-8 コンテンツの長さ: 11
しかし、それを public に変更すると、元に戻ります
キャッシュ制御: 公開 コンテンツ タイプ: テキスト/プレーン。文字セット=utf-8 コンテンツの長さ: 11 Etag: "静的"
これまでのところ、ASP.NET 開発サーバーと IIS6 でこれを実行しましたが、結果は同じでした。また、を使用して ETag を明示的に設定することはできません
Response.AppendHeader("ETag", "static")
更新: IIS7 で実行している場合、ETag ヘッダーを手動で追加することができます。これは、ASP.NET と IIS7 パイプラインの間の緊密な統合が原因であると思われます。
明確化: 長い質問ですが、中心的な質問は次のとおりです。ASP.NET はなぜこのようなことを行うのでしょうか。
更新:基本的に正しいので、トニーの答えを受け入れるつもりです(トニーに行きましょう!)。HttpCacheability.Private を完全にエミュレートしたい場合は、キャッシュ可能性を ServerAndPrivate に設定できますが、呼び出しキャッシュもあります。SetOmitVaryStar (true) そうしないと、キャッシュによってVary: *ヘッダーが出力に追加されますが、それは望ましくありません。編集権限を取得したら、それを回答に編集します(または、このトニーが表示された場合は、回答を編集してその呼び出しを含めることができますか?)