0

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

4

2 回答 2

0

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

Firefox 3 在收到第一个 304 后甚至不打扰服务器。IE7 继续运行,但它正确发送 lastmod/etag 标头并且每次都收到 304。

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

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

于 2008-12-13T10:12:01.690 回答
0

在这里找到了这个答案

一般来说,这些是最常见的遵循的规则(如果你不了解细节不要担心,下面会解释):

  1. 如果响应的标头告诉缓存不要保留它,它不会。
  2. 如果请求经过身份验证或安全,则不会被缓存。
  3. 如果响应中没有验证器(ETag 或 Last-Modified 标头),并且它没有任何明确的新鲜度信息,则它将被视为不可缓存。
  4. 如果满足以下条件,则缓存表示被认为是新鲜的(即,能够发送到客户端而无需与源服务器进行检查):
    • 它具有到期时间或其他年龄控制标头集,并且仍在新鲜期内。
    • 如果浏览器缓存已经看到表示,并且已设置为在会话中检查一次。
    • 如果代理缓存最近看到了该表示,并且它在相对较长之前被修改过。新的表示直接从缓存中提供,无需与原始服务器进行检查。
  5. 如果一个表示是陈旧的,原始服务器将被要求验证它,或者告诉缓存它拥有的副本是否仍然是好的。

如果您不想缓存, Microsoft有一篇很好的文章。

于 2008-12-17T03:31:42.817 回答