Удалить действие из Output Cache - PullRequest
       12

Удалить действие из Output Cache

3 голосов
/ 07 февраля 2012

ASP.Net MVC 3.

Я нашел похожие вопросы / ответы, но, похоже, ни один из них не решил эту проблему ...

Аналог: HttpResponse.RemoveOutputCacheItem не работает

Как «сделать недействительными» части кэша вывода ASP.NET MVC?

Я использую OutputCache для кэширования FileContentResult (изображение).

Мое действие выглядит следующим образом:

[HttpGet]
[OutputCache(Location = OutputCacheLocation.Client, Duration = 300, VaryByParam = "id")]
public FileContentResult Photo(int id) {
    byte[] photo = //GetPhoto;

    return File(photo,"image/jpeg");
}

На мой взгляд, мне нужно следующее:

<img src="@Url.Action("Photo", "Client", new {id = Model.Id})"/>

Это отлично работает, и кэширование вывода работает, как ожидалось .... Теперь проблема

Я пытаюсь сбросить кеш после обновления.

Код в действии, которое обновляет, выглядит следующим образом:

var url = Url.Action("Photo", "Client", new {id = Model.Id});
Response.RemoveOutputCacheItem(url);

Проблема в том, что кэш не сбрасывается.Когда я отлаживаю, я не могу найти, где находится объект кэша (я пробовал System.Web.HttpContext.Current.Cache, но, похоже, в нем нет кэшированного элемента).

Спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

Я использовал этот код, и он прекрасно работает!

http://antix.co.uk/Blog/IfModifiedAttribute

1 голос
/ 07 февраля 2012

Я не совсем уверен в вашем случае, но я нашел информацию о дочерних действиях: они используют собственный кэш (не System.Web.HttpContext.Current.Cache), к которому вы можете получить доступ через статический член

CacheOutputAttribute.ChildActionCache

Кэш дочерних действий имеет довольно сложный ключ, который я не смог вычислить.Итак, я получаю решение добавить новую переменную (например, версию или метку времени) в мою модель и передать ее в качестве параметра в метод действия;поэтому я могу лишить законной силы свой кэш, изменив это свойство.

Однако я не на 100% уверен, что это ваш случай, поскольку вы не выполняете кэширование дочерних действий.

...