我有一个 ASP.NET MVC3 应用程序设置。有一个返回图像的控制器,我添加了以下内容:
[OutputCache(Duration = 3600, VaryByParam = "id;width", Order = 1000, Location = OutputCacheLocation.Client)]
public ActionResult Get(string id, int width)
{ ... }
但是当我查看这些图像上的 HTTP 响应时,它们都有标头“缓存控制:无缓存”和“过期:-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...() 方法后查看缓存变量的状态,内部变量尚未更新。我本来预计会有所改变,但他们仍然显示“无缓存”。
更新2:我应该补充一点,这个方法的返回是:
return File(...);
更新3:我也发现了这个(http://dotnetslackers.com/articles/aspnet/ASP-NET-MVC-3-Controller-for-Serving-Images.aspx)并尝试实现它没有任何运气。仍然在图像的响应标头上获得无缓存选项。
更新4:只需检查服务器设置......如果我绕过我的控制器并直接进入服务器上的图像文件,那么它会缓存并在响应标头中具有正确的缓存设置。
更新 5(是的,快疯了):创建了一个全新的 MVC3 项目,只制作了一个控制器,它缓存得很好。所以我在直接代码之外有一些东西正在添加这个 pragma:no-cache 东西,而对于我的生活,我无法弄清楚它会是什么。=-/