Параметры кэширования

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Используя параметры 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(). В итоге при обращении к ресурсу из различных браузеров мы будем получать различные версии кэша.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850