#asp.net-mvc #outputcache #jsonresult #output-caching
#asp.net-mvc #outputcache #jsonresult #кэширование вывода
Вопрос:
Я застрял, пытаясь выяснить, почему OutputCache не очищается при следующей настройке.
Практически в каждой ссылке, которую я проверил для очистки outputCacheItem, говорится, что нужно просто вызвать метод RemoveOutputCacheItem (string). Однако я нахожу, что это не так. Я получаю метод один раз в отладчике, он переходит к ClearCacheName(), запускает удаление. После этого я больше никогда не обращаюсь к методу, сообщая мне, что кэш застрял, и, следовательно, результирующий набор навсегда равен нулю.
[OutputCache(Duration = int.MaxValue, Location = OutputCacheLocation.Server)]
public JsonResult GetNames()
{
if (SomeResultSet != null)
{
var results =
SomeResultSet
.Where(x => x.LookupName != null)
.OrderBy(x => x.LookupName)
.Select(x => new
{
value = x.LookupName,
label = x.LookupName
}).Distinct();
return new JsonResult() {Data = results, JsonRequestBehavior = JsonRequestBehavior.AllowGet};
}
ClearCacheNames();
return null;
}
private void ClearCacheNames()
{
// OutputCacheAttribute.ChildActionCache = new MemoryCache(new Guid().ToString());
Response.RemoveOutputCacheItem(Url.Action("GetNames","Search",null));
}
Ответ №1:
Проблема в том, что метод кэширует выходные данные. После того, как метод очищает кэш, выходные данные генерируются и кэшируются. Итак, вы ничего не делаете.
Для достижения того, что вы хотите сделать, вы не должны кэшировать выходные данные, но использовать System.Web.Caching.Cache
внутри действия и кэшировать данные.
Вы также можете попробовать сделать это с помощью фильтра, но вы должны создать фильтр, который запускается после OutputCache
фильтра, и предоставить ему необходимую информацию для очистки кэша. Это сложнее реализовать.
Комментарии:
1. Как насчет создания пользовательского атрибута кэша, где в методе OnExecuted он затем вызывал бы метод ClearCacheNames()? Например, специально создать атрибут «clearCache»?