Как остановить MVC-кэширование результатов вызова метода действия? - PullRequest
6 голосов
/ 04 июня 2010

У меня проблема с кэшированием IE результатов метода действия.

Другие статьи, которые я нашел, были связаны с безопасностью и атрибутом [Authorize]. Эта проблема не имеет ничего общего с безопасностью.

Это очень простой метод «записать голосование, получить среднее значение, вернуть среднее и количество голосов». Единственное, что немного интересного в этом - то, что он вызывается через Ajax и возвращает объект Json. Я считаю, что это объект Json, который кэшируется.

Когда я запускаю его из FireFox и наблюдаю за трафиком XHR с помощью Firebug, все работает отлично. Однако в IE 8 графическое изображение «пульсирующего» никогда не успевает отображаться, и элементы страницы, которые отображают «новые» значения avg и count, которые вводятся в страницу с помощью jQuery, никогда не отличаются.

Мне нужен способ, чтобы MVC никогда не кэшировал этот метод действия.

Эта статья, похоже, решает проблему, но я не могу ее понять: Запретить кэширование атрибутов в ASP.NET MVC, принудительное выполнение атрибутов при каждом выполнении действия

Мне нужно немного больше контекста для решения, чтобы понять, как расширить AuthorizationAttribute. Пожалуйста, присылайте свой ответ так, как если бы вы разговаривали с кем-то, у кого нет глубокого понимания MVC, даже если это означает, что нужно ответить статьей о некоторых основах / предварительных условиях, которые необходимы.

Спасибо

Трей Кэрролл

1 Ответ

21 голосов
/ 04 июня 2010

MVC не кэширует результаты. IE делает.

Так что вы должны сказать IE не делать этого.

Вот как я это делаю. Сначала атрибут:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class CacheControlAttribute : ActionFilterAttribute
{
    public CacheControlAttribute(HttpCacheability cacheability)
    {
        this._cacheability = cacheability;
    }

    public HttpCacheability Cacheability { get { return this._cacheability; } } 

    private HttpCacheability _cacheability;

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
        cache.SetCacheability(_cacheability);
    }
}

Далее действие:

    [CacheControl(HttpCacheability.NoCache), HttpGet]
    public JsonResult MyAction()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...