IIS7.5最大年龄问题(ASP.NET MVC输出缓存)

6
我们使用的是Windows Server 2008 R2 Enterprise和IIS7.5.7600.16385,我在服务器上部署了一个简单的Web应用(ASP.NET MVC,C#,.NET Framework 4.5.1)。以下是控制器代码,*.cshtml只输出日期时间:
public class DetailController : Controller
{
    [OutputCache(Duration = 300, VaryByParam = "id")]
    public ActionResult Index(int id)
    {
        return View();
    }
}

当我第一次请求URL http://localhost:80/Detail/Index?id=3 时,响应是正确的。
Cache-Control:public, max-age=300
Date:Mon, 24 Oct 2016 12:11:59 GMT
Expires:Mon, 24 Oct 2016 12:16:51 GMT
Last-Modified:Mon, 24 Oct 2016 12:11:51 GMT

但是,当我再次请求URL(Ctrl+F5)时,max-age不正确(此时响应来自服务器缓存):
Cache-Control:public, max-age=63612908450
Date:Mon, 24 Oct 2016 12:16:34 GMT
Expires:Mon, 24 Oct 2016 12:20:50 GMT
Last-Modified:Mon, 24 Oct 2016 12:15:50 GMT

我不知道为什么最大年龄(max-age)这么大,以及它是如何生成的。当输出缓存过期时(Ctrl + F5),它将重新转换。在我的生产环境中,错误的最大年龄会导致 URL 链接点击从浏览器的磁盘缓存中读取内容。

任何人知道如何解决这个问题吗?


似乎是 .NET Framework 4.6.2(394806)的一个错误,我们的服务器使用的是4.6.2而不是4.5.1。我在安装了.NET Framework 4.5.1的服务器上尝试了一下,它能够正常运行。但是,当我更新到4.6.2时,问题就出现了。 - mofee
请注意,这个错误也影响了StackExchange本身。请参见Nick Craver在这里的回答和他对错误报告的愤怒评论 - isanae
2个回答

5

这是一个已知的问题,.NET 4.6.2存在一个bug,并且有一个KB151864的补丁。

请参见此处以获取更多详细信息:https://github.com/Microsoft/dotnet/issues/330

这将在.NET 4.6.3中修复。目前我不知道是否会提供早期版本的4.6.2修复程序。

目前唯一已知的解决方法是尽可能降级并删除KB151864。

注意:该错误仅影响缓存响应中“Cache-Control”标头中的“max-age”属性的编译。实际的缓存机制和生存期过期是正常工作的。


它已经在4.7上修复了,关于是否将其移植回4.6.x还没有任何消息。 - isanae
看起来他们在2017年5月的4.6.2版本的质量更新预览版中修复了这个问题。 - cflyer
这个版本已不再推荐或可用。 在2017年5月的质量汇总预览安装程序中发现了一个与.NET Framework 4.7安装程序不兼容的错误。只有当先安装了2017年5月的质量汇总预览更新(本次更新)和.NET Framework 4.7,才会出现此错误。 - Offir

0

我刚和微软支持团队交谈过,这是他们回复我的内容:

建议的解决方法是通过卸载更新KB31511864将框架从4.6.2降级到4.6.1。

打开控制面板 -> 程序 -> 程序和功能 -> 已安装的更新。 然后删除 KB3151864,问题就会得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接