关于c#:为什么HttpCacheability.Private抑制ETag?

关于c#:为什么HttpCacheability.Private抑制ETag?

Why does HttpCacheability.Private suppress ETags?

在编写自定义IHttpHandler时,我遇到了关于HttpCachePolicy对象的意外行为。

我的处理程序计算并设置一个实体标签(使用与当前响应对象关联的HttpCachePolicy上的SetETag方法)。如果我使用SetCacheability方法将缓存控件设置为public,那么一切都会像超级按钮一样工作,并且服务器会发送e-tag标头。如果将其设置为私有,则电子标签标头将被隐藏。

也许我只是看起来不够努力,但是我没有在HTTP / 1.1规范中看到任何可以证明这种行为合理的东西。为什么在仍然禁止代理存储数据的同时,不希望将E-Tag发送给浏览器?

1
2
3
4
5
6
7
8
9
10
11
12
13
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; } }
}

将返回

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

但是,如果我们将其更改为公开,它将返回

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

到目前为止,我已经在ASP.NET开发服务器和IIS6上运行了此程序,并获得了相同的结果。我也无法使用以下方式显式设置ETag

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

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

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

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


我认为您需要使用HttpCacheability.ServerAndPrivate

那应该在标题中为您提供cache-control:private,并让您设置一个ETag。

关于该文档的文档需要更好一些。

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


不幸的是,如果您查看.NET Reflector中的System.Web.HttpCachePolicy.UpdateCachedHeaders(),您会发现有一条if语句专门在执行任何ETag任务之前检查Cacheability是否为Private。无论如何,我总是发现Last-Modified/If-Modified-Since对于我们的数据非常有效,并且无论如何在Fiddler中进行监视要容易一些。


如果像我一样,您对此处提到的使用Cacheability.ServerAndPrivate的解决方法不满意,并且您真的想使用专用-也许是因为您是为用户单独定制页面并且在服务器上进行缓存没有意义-那么至少在.NET 3.5中,您可以通过Response.Headers.Add设置ETag,这可以正常工作。

N.B.如果执行此操作,则必须自己实现客户端标头与HTTP 304响应处理的比较-不确定.NET在正常情况下是否可以为您解决此问题。


推荐阅读

    计算机主板BIOS设置详细-BIOS知识

    计算机主板BIOS设置详细-BIOS知识,,什么是电脑BIOS,一般电脑主板已经设置完毕后,电脑就开始按del键进入BIOS。系统启动BIOS,即微机的基本输入

    计算机蓝屏故障的计算机蓝屏解决方案

    计算机蓝屏故障的计算机蓝屏解决方案,,电脑蓝屏电脑故障经常使用电脑的朋友经常遇到,因为电脑蓝屏是一个非常普遍的现象,所以很难预测,什么时

    计算机自动关机的原因是什么

    计算机自动关机的原因是什么,,计算机(计算机),通常称为计算机,是一种用于高速计算的电子计算机。它可以进行数值计算和逻辑计算,还具有存储记忆

    电脑功率计算|电脑功率计算公式

    电脑功率计算|电脑功率计算公式,,电脑功率计算公式  从设计角度出发一般取300w/台基本都可以满足要求,可以从以下几个方面分析一下电脑功

    如何设置计算机视图视图的统一视图

    如何设置计算机视图视图的统一视图,,不知道你是否有这样的使用电脑经验,电脑在不同的文件夹打开,有时这个文件夹是用来查看列表的方式,但是当

    的故障_计算机解决无法打印文档

    的故障_计算机解决无法打印文档,,核心提示:最近,打印机出现了一个奇怪的现象,在打印正常之前,打印机不能打印最近的突然,提示发送打印作业,计算

    PC计算机:AMDCPU核心细节

    PC计算机:AMDCPU核心细节,,核心提示:AthlonXP的核心型athlonxp有4种不同的核心类型,但都有个共同点:他们都使用socketa接口,他们都使用PR标称值

    分析计算机减速的原因

    分析计算机减速的原因,,核心提示:做以上九点,我相信你的爱是快的。当然,如果速度很慢,你应该考虑硬件升级。学习电脑组装,就来吧… 有很多人说

    什么是计算机待机意味着计算机待机功耗

    什么是计算机待机意味着计算机待机功耗,,近年来,在计算机配置和各大论坛,百度知道,搜搜问问报价,电脑待机问题的用户,在问题更感兴趣,如什么是备