缓存问题

时间:2008-12-13 07:39:34

标签: asp.net caching http-headers http-caching

我有一个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)。 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果我删除了您在第一行的etag周围添加的引号,那么您的代码段对我来说很好。但我猜这只是片段中的一个错误,而不是你面临的真正问题。

Firefox 3 dosnt甚至懒得在它收到第一个304之后命中服务器.IE7继续运行,但它正确发送lastmod / etag标头并且每次都收到304.

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

为了使它更清洁一点,你可以使用Response.Caching上的方法,而不是直接设置头文件。

答案 1 :(得分:0)

找到了这个答案here

一般来说,这些是最常见的规则(如果您不了解细节,请不要担心,将在下面说明):

  1. 如果响应的标题告诉了 缓存不保留它,它不会。
  2. 如果请求已通过身份验证或 安全,它不会被缓存。
  3. 如果没有验证器(ETag或Last-Modified 标题)出现在响应中, 它没有任何明确的 新鲜度信息,它将是 被认为是无法解决的。
  4. 缓存的表示形式被认为是新鲜的 (也就是说,能够被发送到 客户没有检查 原始服务器)如​​果:
    • 它有效期 时间或其他年龄控制标题 设置,并仍然是新鲜的 期。
    • 如果浏览器缓存已经看到了表示,并且 已设置为一次会话检查。
    • 如果代理缓存最近已经看到了代表,那么它 很久以前就被修改了。 提供新鲜的陈述 直接来自缓存,没有 检查原始服务器。
  5. 如果陈述是陈旧的,那么 将要求原始服务器 验证它,或告诉缓存 是否有它的副本 还是不错的。
  6. Microsoft如果您不希望它缓存,则会有一篇好文章。