Как "аннулировать" части кэша вывода ASP.NET MVC?
Есть ли способ программно аннулировать части кеша вывода ASP.NET MVC? То, что я хотел бы сделать, - это если пользователь отправляет данные, которые изменяют то, что будет возвращено из кешированного действия, сможет сделать недействительными данные кэширования.
Возможно ли это?
Ответы
Ответ 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));
}