-
21-08-2019 - |
题
我有一个 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或最后修饰的标头),并且没有任何明确的新鲜信息,则将被认为是无法可控的。
- 如果以:
- 它具有到期的时间或其他年龄控制的标题,并且仍在新的时期内。
- 如果浏览器缓存已经看到了表示形式,并设置了一次会话检查。
- 如果代理缓存最近已经看到了该表示形式,并且相对较早地进行了修改。直接从缓存提供新的表示形式,而无需与Origin服务器核对。
- 如果表示陈旧,则将要求Origin服务器验证它,或者告诉缓存该副本是否仍然不错。
和 微软 如果您不想缓存它,有一篇好文章。
其他提示
您的代码段工作正常,我如果我删除你在第一线周围添加的eTag引号。但即时猜测那只是在片段一个错误,而不是你所面临的现实问题。
火狐3 dosnt甚至懒得点击服务器其已接收后的第一个304 IE7保持下去,但它正确地发送的lastmod / ETag头和接收304各一次。
您确信它不会因为你已经在你的浏览器更改缓存设置?我想尝试一下在另一个浏览器,以确保。
要使它有点清洁剂可以使用上Response.Caching,而不是直接设置标题的方法。
不隶属于 StackOverflow