VaryByHeader с OutputCacheAttribute для дочерних действий

С помощью [OutputCacheAttribute] в ASP.NET MVC 3 вы можете выводить кеш с большой гибкостью. Полезно использовать свойство VaryByHeader для кэширования кэша по имени хоста. Например:

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

Тем не менее, при действиях с детьми вы не можете применять "VaryByHeader". Структура создает следующее исключение:

OutputCacheAttribute для дочерних действий поддерживает только продолжительность, VaryByCustom и VaryByParam. Пожалуйста, не устанавливайте CacheProfile, Расположение, NoStore, SqlDependency, VaryByContentEncoding или Значения VaryByHeader для дочерних действий.

Мой вопрос: почему?

Является ли причина, по которой мы не можем VaryByHeader в дочернем действии, потому что это обеспечило бы противоречивую дисперсию, поскольку родительское действие могло бы указать другое значение VaryByHeader?

Если я хочу кэшировать дочерние действия по-разному на основе имени хоста, что это значит и как я могу это сделать?

Ответ 1

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;
}