Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Используя параметры VaryByHeader, VaryByCustom и VaryByParam атрибута OutputCache, мы можем управлять версиями кэша и в зависимости от условий предоставлять одну или другую версию кэшированных данных. Применение вариантов кэширования повышает гибкость приложения.
При получении запроса мы получаем различные заголовки и можем определить вид заголовка, по которому будет идти дифференциация кэша. Например:
public class HomeController : Controller { static int x = 9; [OutputCache(Duration=30, Location= OutputCacheLocation.Any, VaryByHeader="user-agent")] public string Index() { x++; return x.ToString(); } }
И если мы обратимся к приложению одновременно из разных браузеров, которые будут посылать разные заголовки для параметра user-agent, то мы увидим разные результаты.
Параметр VaryByParam
задает набор параметров, для которых будут генерироваться различные версии кэшированных данных:
public class HomeController : Controller { static int x = 9; [OutputCache(Duration=30, Location= OutputCacheLocation.Any, VaryByParam="title;id")] public string Index(string title, int? id) { x++; return x.ToString(); } }
Если мы хотим генерировать различные версии кэша для нескольких параметров, то эти параметры указываются через точку с запятой. Также можно
указать с помощью знака *
, чтобы генерировались версии кэша для всех возможных наборов параметров.
В данном случае для различных значений параметров title и id будут создаваться разные версии кэшированных данных.
И если в двух разных браузерах мы, например, наберем в адресной строке http://localhost:2000/Home/Index/title=mvc, то они отобразят одно и то же значение из кэша.
С помощью свойства VaryByCustom
мы можем сами определить значения, по которым будут генерироваться разные версии кэша. Для этого перейдем к файлу Global.asax и переопределим
в классе MvcApplication метод GetVaryByCustomString
:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } public override string GetVaryByCustomString(HttpContext context, string custom) { if (custom == "browser") { return context.Request.Browser.Browser; } else { return base.GetVaryByCustomString(context, custom); } } }
Метод прост: если переданный параметр имеет значение "browser", то возвращается название браузера, если нет, то идет обращение к вызову метода из родительского класса.
Теперь установим соответствующим образом атрибут OutputCache:
public class HomeController : Controller { static int x = 9; [OutputCache(Duration=30, Location=OutputCacheLocation.Any, VaryByCustom="browser")] public string Index(string title, int? id) { x++; return x.ToString(); } }
Значение атрибута как раз и представляет то значение, которое в качестве параметра будет передаваться в метод GetVaryByCustomString()
. В
итоге при обращении к ресурсу из различных браузеров мы будем получать различные версии кэша.