我有一个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的东西,对于我的生活,我无法弄清楚它是什么。 = - /
答案 0 :(得分:0)
尝试将缓存能力从HttpCachability.Private
更改为HttpCachability.ServerAndPrivate
。它应该将缓存控制保持为私有,而不是抑制电子标签/最后修改。
答案 1 :(得分:0)
我正在使用SocialAuth-net并在设置过程中的某个地方为其添加了system.webServer模块并设置了runAllManagedModulesForAllRequests = true。我想,“嗯,不知道这是不是以某种方式造成它”,因为我无法在这个特定的应用程序之外重现问题。低,观看,评论配置的部分和我的图像开始缓存! Hoorah!
但是,它变得更加怪异。我解除了我的配置更改,刷新了,现在我仍然在进行缓存。我无法告诉你我已经完成了多少次系统重置但没有改变,但不知何故暂时从管道中删除这些模块似乎已经解决了这个问题。
我可以将其追踪到SocialAuthHttpModule,如果我将其删除,SocialAuth-net似乎仍然有效,但缓存可靠地恢复。非常奇怪。