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

有帮助吗?

解决方案

找到了这个答案 这里

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

  1. 如果响应的标题告诉缓存不保留它,则不会。
  2. 如果请求已进行身份验证或安全,则不会被缓存。
  3. 如果响应中没有验证器(ETAG或最后修饰的标头),并且没有任何明确的新鲜信息,则将被认为是无法可控的。
  4. 如果以:
    • 它具有到期的时间或其他年龄控制的标题,并且仍在新的时期内。
    • 如果浏览器缓存已经看到了表示形式,并设置了一次会话检查。
    • 如果代理缓存最近已经看到了该表示形式,并且相对较早地进行了修改。直接从缓存提供新的表示形式,而无需与Origin服务器核对。
  5. 如果表示陈旧,则将要求Origin服务器验证它,或者告诉缓存该副本是否仍然不错。

微软 如果您不想缓存它,有一篇好文章。

其他提示

您的代码段工作正常,我如果我删除你在第一线周围添加的eTag引号。但即时猜测那只是在片段一个错误,而不是你所面临的现实问题。

火狐3 dosnt甚至懒得点击服务器其已接收后的第一个304 IE7保持下去,但它正确地发送的lastmod / ETag头和接收304各一次。

您确信它不会因为你已经在你的浏览器更改缓存设置?我想尝试一下在另一个浏览器,以确保。

要使它有点清洁剂可以使用上Response.Caching,而不是直接设置标题的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top