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