为什么我的图像没有缓存?

时间:2012-07-13 03:27:09

标签: asp.net-mvc-3 http-caching

我有一个ASP.NET MVC3应用程序设置。有一个控制器返回图像,我添加了以下内容:

[OutputCache(Duration = 3600, VaryByParam = "id;width", Order = 1000, Location = OutputCacheLocation.Client)]
public ActionResult Get(string id, int width)
{ ... }

但是当我在这些图像上查看HTTP响应时,它们都有标题“cache-control:no-cache”和“expires:-1”,这意味着浏览器永远不会缓存它们。

我正在四处寻找,我找不到任何关于为什么响应告诉浏览器不要缓存它们的内容。我甚至尝试过自己的属性:

public class ContentExpiresHeader : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        var cache = filterContext.HttpContext.Response.Cache;
        cache.SetExpires(DateTime.Now.AddYears(1));
        cache.SetCacheability(HttpCacheability.Private);
        cache.SetLastModifiedFromFileDependencies();
        base.OnResultExecuted(filterContext);
    }
}

但这也没让我到任何地方。

感谢任何帮助。

更新:我开始认为这必须是一个添加无缓存和覆盖的IIS设置。但我似乎找不到任何东西。唯一奇怪的是,如果我在调用.Set ...()方法之后查看 cache 变量的状态,则内部变量尚未更新。我本来希望有些东西可以改变但是它们仍然显示出“无缓存”。

更新2:我应该补充一点,这个方法的回报是:

return File(...);

更新3:我也找到了这个(http://dotnetslackers.com/articles/aspnet/ASP-NET-MVC-3-Controller-for-Serving-Images.aspx)并尝试实施它而没有任何运气。仍然在图像的响应头上获得无缓存选项。

更新4:只需检查服务器设置...如果我绕过我的控制器并直接转到服务器上的图像文件,那么它就会缓存并在响应头中具有正确的缓存设置。

更新5(是的,变得疯狂):创建了一个全新的MVC3项目并且只创建了一个控制器并且它缓存得很好。所以我在即时代码之外有一些东西正在添加这个pragma:no-cache的东西,对于我的生活,我无法弄清楚它是什么。 = - /

2 个答案:

答案 0 :(得分:0)

尝试将缓存能力从HttpCachability.Private更改为HttpCachability.ServerAndPrivate。它应该将缓存控制保持为私有,而不是抑制电子标签/最后修改。

答案 1 :(得分:0)

发现问题了!这是我一段时间以来见过的最奇怪的事情。

我正在使用SocialAuth-net并在设置过程中的某个地方为其添加了system.webServer模块并设置了runAllManagedModulesForAllRequests = true。我想,“嗯,不知道这是不是以某种方式造成它”,因为我无法在这个特定的应用程序之外重现问题。低,观看,评论配置的部分和我的图像开始缓存! Hoorah!

但是,它变得更加怪异。我解除了我的配置更改,刷新了,现在我仍然在进行缓存。我无法告诉你我已经完成了多少次系统重置但没有改变,但不知何故暂时从管道中删除这些模块似乎已经解决了这个问题。

我可以将其追踪到SocialAuthHttpModule,如果我将其删除,SocialAuth-net似乎仍然有效,但缓存可靠地恢复。非常奇怪。