4

我有一个 ASP.NET MVC 方法(.NET 4.0 上的 v3.0)设置如下:

[OutputCache(Duration = 31536000, Location = OutputCacheLocation.Any)]
public virtual ActionResult Item()
{
    this.Response.Cache.SetLastModified(new DateTime(2011, 01, 01));
    return this.Content("hello world", "text/plain");
}

我希望这会以指定的Last-Modified标头设置返回Mon, 07 Feb 2011 00:00:00 GMT,但它实际上是作为输出第一次缓存在输出缓存中的日期返回(即自 IIS 重置后第一次调用该方法)。

如果我注释掉该[OutputCache]属性以便没有完成输出缓存,那么Last-Modified标头会按预期返回,因此看起来输出缓存基础结构中的某些东西选择忽略我为此指定的值。

知道为什么它可能会这样做吗?有没有办法让它使用我指定的值作为Last-Modified日期?

4

2 回答 2

2

[OutputCache]好吧,我从来没有弄清楚发生这种情况的原因,但它看起来像是属性使用的 ASP.NET 页面缓存基础结构中的某个错误。

我最终编写了一个[HttpCache]具有几乎相同公共接口的自定义属性,但它Response.Cache直接在对象上调用适当的缓存方法,而不是委托给 ASP.NET 页面缓存基础结构。

这很好用。遗憾的是内置属性没有。

于 2011-03-18T10:26:35.137 回答
0

在 Controller 的 OnResultExecuting 事件期间,[OutputCache] 创建一个 System.Web.UI.Page 的实例来处理属性中指定的缓存属性。他们这样做是因为 Page 已经有逻辑将 OutputCacheParameters 转换为实际的 http 缓存指令。

https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/OutputCacheAttribute.cs

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (!filterContext.IsChildAction)
        {
            // we need to call ProcessRequest() since there's no other way to set the Page.Response intrinsic
            using (OutputCachedPage page = new OutputCachedPage(_cacheSettings))
            {
                page.ProcessRequest(HttpContext.Current);
            }
        }
    }

OutputCacheAttribute 基本上将输出从原始处理程序(控制器)复制到为配置缓存而创建的页面。

这里的缺点是添加到原始 HttpResponse 的标头不会被复制到新的处理程序(页面)。这意味着不可能在控制器中的 Response 上设置标头。实际处理请求的 Page 会忽略这些标头。

于 2014-03-27T20:51:24.443 回答