asp.net-mvc - Firefox 存储了缓存的不完整响应

标签 asp.net-mvc http caching https

我刚刚发现部分响应在我们客户的一台机器中被缓存为完整的,这导致整个网站无法使用。我完全不知道那里可能出了什么问题。

那么在下面的设置中可能出了什么问题?

在服务器端,我们有一个 ASP.NET 应用程序正在运行。一个 IHttpHandler 处理对 javascript 文件的请求。它基本上根据请求缩小文件并将结果写入响应流。它还会记录写入响应流的字符串的长度:

String javascript = /* Javascript is retrieved here */;
HttpResponse response = context.Response;
response.ContentEncoding = Encoding.UTF8;
response.ContentType = "application/javascript";
HttpCachePolicy cache = response.Cache;
cache.SetCacheability(HttpCacheability.Public);
cache.SetMaxAge(TimeSpan.FromDays(300));
cache.SetETag(ETag);
cache.SetExpires(DateTime.Now.AddDays(300));
cache.SetLastModified(LastModified);
cache.SetRevalidation(HttpCacheRevalidation.None);
response.Headers.Add("Vary", "Accept-Encoding");
Log.Info("{0} characters sent", javascript.length);
response.Write(javascript);
response.Flush();
response.End();

然后通常使用带有分块传输编码的 gzip 编码发送内容。对我来说似乎很简单。

不幸的是,我刚刚与用户进行了远程 session ,其中只有大约 1/3 的文件在缓存中,这当然破坏了文件(15k 而不是 44k)。在缓存中,内容编码也设置为 gzip,所有通信都通过 https 进行。

在用户机器上打开源文件后,我只需按 Ctrl-F5 即可立即显示全部内容。

可能出了什么问题?

如果重要,请在下面找到来自 Firefox 的缓存条目:

Cache entry information
key:    <resource-url>
fetch count:    49
last fetched:   2015-04-28 15:31:35
last modified:  2015-04-27 15:29:13
expires:    2016-02-09 14:27:05
Data size:  15998 B
Security:   This is a secure document.
security-info: (...)
request-method:     GET
request-Accept-Encoding:    gzip, deflate
response-head:  HTTP/1.1 200 OK
Cache-Control: public, max-age=25920000
Content-Type: application/javascript; charset=utf-8
Content-Encoding: gzip
Expires: Tue, 09 Feb 2016 14:27:12 GMT
Last-Modified: Tue, 02 Jan 2001 11:00:00 GMT
Etag: W/"0"
Vary: Accept-Encoding
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
Date: Wed, 15 Apr 2015 13:27:12 GMT
necko:classified:   1

最佳答案

您的客户端浏览器很可能缓存了 JavaScript 文件,这意味着您的脚本的 src 没有改变。

例如,如果您要请求 myScripts

<script src="/myScripts.js">

然后第一次,客户端将请求该文件,并且浏览器将在以后的任何时间读取其缓存。

您需要在脚本末尾附加某种唯一值(例如时间戳),这样即使浏览器缓存了文件,新时间戳也将像新文件名一样工作。

客户端在按下 Ctrl+F5 后收到新脚本,因为这是清空浏览器缓存的快捷方式。

MVC 有一个非常好的方法来做到这一点,它涉及附加一个唯一的代码,该代码在每次应用程序或其应用程序池重新启动时都会发生变化。查看MVC Bundling and Minification .

希望这对您有所帮助!

关于asp.net-mvc - Firefox 存储了缓存的不完整响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29922833/

相关文章:

ios - 为什么 `HttpClient` 返回 `NSURLSessionDataTask` 但调用的 `API method` 除外 ` { JSONResult, error in`

php - 你知道有什么好的基于文件的 PHP 缓存吗?

asp.net-mvc - Plupload Asp.Net MVC如何将不同的参数传递到ActionResult方法中

asp.net-mvc - 模拟 HttpPostedFileBase 和 InputStream 进行单元测试

javascript - AngularJS 的 HttpPost 调用抛出 500-内部服务器错误

c# - 异步功能未完成,但我没有收到任何错误消息

asp.net-mvc - 是否可以使 HtmlHelper 扩展方法仅对具有特定类型的 View 可用

具有部分结果的批量查询的 REST 状态代码

PHP常量__FILE__与URL中的不一样

java - 清除 Java 缓存