在子操作上使用OutputCacheAttribute的VaryByHeader

时间:2012-02-16 22:47:42

标签: c# asp.net-mvc-3 caching

使用ASP.NET MVC 3中的[OutputCacheAttribute],您可以非常灵活地输出缓存。利用'VaryByHeader'属性按主机名进行缓存是很有用的。例如:

[OutputCache(Duration = 60, VaryByHeader = "host")]
public ActionResult Foo()
{
    return this.View();
}

但是,对于子操作,您无法应用'VaryByHeader'。该框架抛出以下异常:

  

子操作的OutputCacheAttribute仅支持Duration,   VaryByCustom和VaryByParam值。请不要设置CacheProfile,   Location,NoStore,SqlDependency,VaryByContentEncoding或   子动作的VaryByHeader值。

我的问题是,为什么?

我们不能在子操作中使用VaryByHeader,因为它会提供冲突的方差,因为父操作可能指定了不同的VaryByHeader值吗?

如果我想根据主机名不同地缓存子操作,这意味着什么,我将如何处理它?<​​/ p>

1 个答案:

答案 0 :(得分:13)

VaryByHeader会影响实际的HTTP响应标头;所以你可能是正确的,MVC团队阻止了这一点,以防止与父行动发生冲突。

要根据主机名进行缓存,您是否可以使用VaryByCustom?像(免责声明:根本没试过这个):

[OutputCache(Duration = 60, VaryByCustom = "host")]
public ActionResult Foo()
{
    return View();
}

后跟(在你的Global.asax.cs中)

public override string GetVaryByCustomString(HttpContext context, string arg)
{
    if (arg == "host")
    {
        return context.Request.Headers["host"];
    }

    // whatever you have already, or just String.Empty
    return String.Empty;
}