3

我有一个 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 东西,而对于我的生活,我无法弄清楚它会是什么。=-/

4

2 回答 2

0

尝试将可缓存性从 更改HttpCachability.PrivateHttpCachability.ServerAndPrivate。它应该将缓存控制保持为私有,而不是抑制电子标签/上次修改。

于 2012-07-13T05:10:59.163 回答
0

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

我正在使用 SocialAuth-net,在设置过程中的某个地方,我为其添加了 system.webServer 模块并设置 runAllManagedModulesForAllRequests=true。我想,“嗯,想知道这是否会导致它”,因为我无法在这个特定的应用程序之外重现这个问题。低头看,注释掉配置的那部分,我的图像开始缓存!万岁!

但是,它变得更奇怪了。我撤消了我的配置更改,刷新了,现在我仍在缓存。我无法告诉您我在没有任何更改的情况下完成了多少次系统重置,但以某种方式暂时从管道中删除这些模块似乎已经解决了这个问题。

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

于 2012-07-19T02:03:55.263 回答