C# 子操作上具有OutputCacheAttribute的VaryByHeader

C# 子操作上具有OutputCacheAttribute的VaryByHeader,c#,asp.net-mvc-3,caching,C#,Asp.net Mvc 3,Caching,使用ASP.NET MVC 3中的[OutputCacheAttribute],您可以非常灵活地输出缓存。利用“VaryByHeader”属性按主机名进行bucket缓存是很有用的。例如: [OutputCache(Duration = 60, VaryByHeader = "host")] public ActionResult Foo() { return this.View(); } 但是,在子操作上,不能应用“VaryByHeader”。框架引发以下异常: 子操作的Output

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

[OutputCache(Duration = 60, VaryByHeader = "host")]
public ActionResult Foo()
{
    return this.View();
}
但是,在子操作上,不能应用“VaryByHeader”。框架引发以下异常:

子操作的OutputCacheAttribute仅支持持续时间, VaryByCustom和VaryByParam值。请不要设置缓存配置文件, 位置、NoStore、SqlDependency、varyByContentEncode或 子操作的VaryByHeader值

我的问题是,为什么

之所以不能在子操作中使用VaryByHeader,是因为它会提供冲突的差异,因为父操作可能指定了不同的VaryByHeader值


如果我想根据主机名对子操作进行不同的缓存,这意味着什么,我将如何进行缓存?

VaryByHeader
会影响实际的HTTP响应头;因此,MVC团队阻止此操作是为了防止与父操作冲突,您可能是对的

要基于主机名进行缓存,不能使用
VaryByCustom
?类似(免责声明:根本没有尝试过):

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


仅仅使用VaryByHeader就可以实现基于主机名的缓存。例如,在主机名为2的场景中,子操作将缓存两次,一次用于主机a,一次用于主机B。您不需要使用VaryByCustom。(虽然您的方法确实也会起作用,并且可能与VaryByHeader的实现非常类似)。当然,但是由于您不能在ChildAction中使用
VaryByHeader
。)只是好奇,子操作是否会导致另一个HTTP get?也许设计人员认为,由于没有第二次回发,因此不需要通过不同的http头进行缓存。不,子操作只是同一请求中的一个抽象。
[OutputCache(Duration = 60, VaryByCustom = "host")]
public ActionResult Foo()
{
    return View();
}
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;
}