Как лучше всего работать с заголовком Expires в ASP.NET MVC? - PullRequest
7 голосов
/ 16 февраля 2009

Я хочу иметь возможность установить длительный срок действия для определенных элементов, которые пользователь загружает с помощью запроса GET.

Я хочу сказать «это хорошо для 10 минут» (т.е. я хочу установить заголовок Expires на +10 минут). Запросы представляют собой фрагменты HTML, которые отображаются на странице через AJAX, и они хороши для сеанса пользователя. Я не хочу возвращаться на сервер и получать 304 , если они понадобятся снова - я хочу, чтобы кеш браузера мгновенно выдал мне тот же предмет.

Я нашел статью почти 100 лет о Кэшировании и сжатии фильтра действий MVC . Это создает пользовательский ActionFilter для изменения заголовка expires. Я уже использую фильтр сжатия, который отлично работает для некоторых пользовательских css, которые я генерирую (степень сжатия 94%!).

У меня есть две основные проблемы:

1) Мне действительно нужно использовать этот метод. Я в порядке, если я это сделаю, но разве нет никакой функциональности в MVC или функциональности OutputCache, чтобы сделать это для меня? В «традиционном» ASP.NET я всегда просто устанавливал заголовок Expires вручную, но мы больше не можем этого делать - по крайней мере, в контроллере.

2) Если я использую этот метод фильтра - будет ли он вообще мешать политике OutputCache - которой я хочу управлять в web.config. Я думаю, что оба они взаимоисключающие, и вы не захотите и того, и другого, но я не совсем уверен.

Ответы [ 3 ]

3 голосов
/ 16 февраля 2009
  1. Нет, у вас нет , чтобы использовать этот метод. Тем не менее, я думаю, что это, вероятно, лучший метод для выбора, потому что он делает контроллер более тестируемым и менее осведомленным о сети. Альтернативой может быть установка заголовка вручную в контроллере, например:

    Response.AddHeader («Истекает», «Четверг, 01 декабря 1994 г., 16:00:00 по Гринвичу»);

  2. Что ж, атрибут OutputCache управляет тем, когда действие выполняется вообще и когда вместо этого он возвращает кэшированный HTML. Expires сообщает браузеру, когда нужно повторно извлечь HTML. Поэтому я бы не назвал их взаимоисключающими, но они, безусловно, являются двумя сторонами одной медали, и вы правы, полагая, что вам может не нужны оба. Я бы посоветовал просмотреть спецификации HTTP , чтобы решить, что наиболее подходит для вашего приложения.

2 голосов
/ 10 мая 2011

Response.Expires Это свойство указывает количество минут до истечения срока действия страницы, кэшированной в браузере, т.е. если пользователь возвращается на ту же страницу до указанного количества минут, отображается кешированная версия страницы.

Response.ExpiresAbsolute Используя это свойство, мы можем установить дату и / или время истечения срока хранения кэшированной в браузере страницы.

http://forums.asp.net/t/1532229.aspx

0 голосов
/ 12 декабря 2013

Звучит так, как будто вам просто нужно изменить пользователя:

http://aspadvice.com/blogs/ssmith/archive/2007/10/29/VaryByCustom-Caching-By-User.aspx

[OutputCache(Duration="10", VaryByCustom="username")]

Global.asax:

public override string GetVaryByCustomString(HttpContext context, string key)
{
    switch(key)
    {
        case "username":
            return context.User.Identity.Name;

        // Other VaryByCustom strategy implementations can go here.
    }

    return string.Empty;
}
...