Asp.net 缓存问题

Asp.net 缓存问题,asp.net,caching,http-headers,http-caching,Asp.net,Caching,Http Headers,Http Caching,我有一个aspx页面,但所有内容都是手工生成的(是的,我知道我需要做一个处理程序,我还有一个问题) 我想在客户端浏览器中缓存输出。问题是它只缓存一个查询 public static void ProceedCaching(string etag, string lastModify, string response, HttpResponse Response, HttpRequest Request)

我有一个aspx页面,但所有内容都是手工生成的(是的,我知道我需要做一个处理程序,我还有一个问题)

我想在客户端浏览器中缓存输出。问题是它只缓存一个查询

        public static void ProceedCaching(string etag, string lastModify, string response, HttpResponse Response,
                                      HttpRequest Request)
    {
        Response.AddHeader("ETag", "\"" + etag + "\"");
        Response.AddHeader("Last-Modified", lastModify);
        Response.AppendHeader("Cache-Control", "Public");
        Response.AppendHeader("Expires",
                              DateTime.Now.AddMinutes(1).ToUniversalTime().ToString("r",DateTimeFormatInfo.InvariantInfo));

        string ifModified = Request.Headers["If-Modified-Since"];

        if (!string.IsNullOrEmpty(ifModified))
        {
            if (ifModified.Contains(";"))
                ifModified = ifModified.Remove(ifModified.IndexOf(';'));
        }

        string incomingEtag = Request.Headers["If-None-Match"];

        if (String.Compare(incomingEtag, etag) == 0 || string.Compare(ifModified, lastModify) == 0)
        {
            Response.StatusCode = 304;
            Response.End();
        }

        Response.Write(response);
        Response.End();
    }
它变得一团糟。 正如我所说,它只缓存了一次。收到HTTP 304后,浏览器将发送不带缓存信息的干净请求(etag,lastmodified)。
你有什么想法吗

如果我删除了您在第一行etag周围添加的引号,您的代码片段就可以正常工作。但我猜这只是片段中的一个错误,而不是你面临的真正问题

Firefox3在收到第一个304后甚至懒得去攻击服务器。IE7一直在运行,但它正确地发送lastmod/etag头并每次接收304

您确定这不是因为您更改了浏览器中的缓存设置吗?我会在另一个浏览器中试用,以确保安全

为了使它更简洁,您可以使用Response.Caching上的方法,而不是直接设置标题。

找到了这个答案

一般来说,以下是最常见的规则(如果您不了解细节,请不要担心,下面将对其进行解释):

  • 如果响应的标题告诉 缓存不保存它,它不会
  • 如果请求经过身份验证,或者 安全,它不会被缓存
  • 如果没有验证器(ETag或上次修改 标题)出现在响应上, 它没有任何明确的定义 新鲜度信息,它将 被认为是不可实现的
  • 缓存的表示被认为是新的 (也就是说,能够发送到 未与客户核实的客户 原始服务器)如果:
    • 它已经过期了 时间或其他年龄控制标题 设置,并仍然在新鲜的 句号
    • 如果浏览器缓存已看到该表示,以及 已设置为每会话检查一次
    • 如果代理缓存最近看到了表示,并且 在相对较长的时间前进行了修改。 新的申述已送达 直接从缓存中,无需 正在与源服务器进行检查
  • 如果表示已过时,则 将要求原始服务器 验证它,或者告诉缓存 它所拥有的副本是否 还不错
  • 如果你不想把它缓存起来,那就有一篇好文章。

    很抱歉我不在(我正在度假),我想你是对的。引号中的问题