使用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>
答案 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;
}