Подтвердить что ты не робот

Как "аннулировать" части кэша вывода ASP.NET MVC?

Есть ли способ программно аннулировать части кеша вывода ASP.NET MVC? То, что я хотел бы сделать, - это если пользователь отправляет данные, которые изменяют то, что будет возвращено из кешированного действия, сможет сделать недействительными данные кэширования.

Возможно ли это?

4b9b3361

Ответ 1

Один из способов - использовать метод:

HttpResponse.RemoveOutputCacheItem("/Home/About");

Здесь описывается другой способ: http://aspalliance.com/668

Я думаю, что вы могли бы реализовать второй метод, используя атрибут уровня метода для каждого действия, которое вы хотите, и просто добавьте к нему строку, представляющую ключ. Это, если я понял ваш вопрос.

Изменить: Да, asp.net mvc OutputCache - это просто оболочка.

Если вы используете varyByParam="none", тогда вы просто недействительны "/Statistics" - это, если <id1>/<id2> являются значениями querystring. Это приведет к аннулированию всех версий страницы.

Я сделал быстрый тест, и если вы добавите varyByParam="id1", а затем создадите несколько версий страницы - если вы скажете invalidate invalidate "/Statistics/id1", это приведет к недействительности именно этой версии. Но вы должны продолжить тесты.

Ответ 2

Я сделал несколько тестов на кеширование. Вот что я нашел:

Вы должны очистить кеш для каждого маршрута, который приведет к вашему действию. Если у вас есть 3 маршрута, которые приводят к тому же действию в вашем контроллере, у вас будет один кеш для каждого маршрута.

Скажем, у меня есть этот маршрут config:

routes.MapRoute(
                name: "config1",
                url: "c/{id}",
                defaults: new { controller = "myController", action = "myAction", id = UrlParameter.Optional }
                );

            routes.MapRoute(
                name: "Defaultuser",
                url: "u/{user}/{controller}/{action}/{id}",
                defaults: new { controller = "Accueil", action = "Index", user = 0, id = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Accueil", action = "Index", id = UrlParameter.Optional }
            );

Затем эти 3 маршрута приводят к myAction в myController с параметром myParam:

Если мое действие выполняется следующим образом

public class SiteController : ControllerCommon
    {

        [OutputCache(Duration = 86400, VaryByParam = "id")]
        public ActionResult Cabinet(string id)
        {
             return View();
}
}

У меня будет один кеш для каждого маршрута (в этом случае 3). Поэтому мне придется аннулировать каждый маршрут.

Подобно этому

private void InvalidateCache(string id)
        {
            var urlToRemove = Url.Action("myAction", "myController", new { id});
            //this will always clear the cache as the route config will create the path
            Response.RemoveOutputCacheItem(urlToRemove);
            Response.RemoveOutputCacheItem(string.Format("/myController/myAction/{0}", id));
            Response.RemoveOutputCacheItem(string.Format("/u/0/myController/myAction/{0}", id));
        }