当前位置:  开发笔记 > 编程语言 > 正文

为什么HttpCacheability.Private会抑制ETag?

如何解决《为什么HttpCacheability.Private会抑制ETag?》经验,为你挑选了1个好方法。

在编写自定义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; } }
}

将返回

Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 11

但如果我们将其改为公开,它将会回归

Cache-Control: public
Content-Type: text/plain; charset=utf-8
Content-Length: 11
Etag: "static"

到目前为止,我已经在ASP.NET开发服务器和IIS6上运行了相同的结果.此外,我无法使用明确设置ETag

Response.AppendHeader("ETag", "static")

更新:在IIS7中运行时可以手动附加ETag标头,我怀疑这是由ASP.NET和IIS7管道之间的紧密集成引起的.

澄清:这是一个很长的问题,但核心问题是:为什么ASP.NET会这样做,我该如何解决它?我应该这样做吗?

更新:我将接受Tony的答案,因为它基本上是正确的(去Tony!).我发现如果你想完全模拟HttpCacheability.Private,你可以设置ServerAndPrivate的可缓存性,但你也有调用缓存.SetOmitVaryStar(true)否则缓存会将Vary:*标头添加到输出中,您不希望这样.当我获得编辑权限时,我会将其编辑到答案中(或者如果您看到这个Tony也许您可以编辑您的答案以包含该呼叫?)



1> TonyB..:

我认为你需要使用HttpCacheability.ServerAndPrivate

这应该给你缓存控制:标题中的私有,让你设置一个ETag.

关于它的文档需要更好一些.

编辑: Markus发现你也调用了cache.SetOmitVaryStar(true),否则缓存会将Vary:*标题添加到输出中,你不希望这样.


我不知道[这个答案](http://stackoverflow.com/a/2633452/1869660)是否有一个不同的问题描述了为什么@Markus将调用添加到`SetOmitVaryStar()`,但是从ASP开始. NET 4.0可能不再需要了.
推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有