Удалить OutputCache из контроллера MVC

#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»?