ASP.NET MVC OutputCache различаются * и различаются в зависимости от файла cookie пользователя. - PullRequest
20 голосов
/ 21 марта 2011

У меня есть проект asp.net mvc 3, и у меня есть домашний контроллер. Я пометил свое действие Index этим атрибутом:

[OutputCache(Location = System.Web.UI.OutputCacheLocation.Any, Duration = 120, VaryByParam = "*", VaryByCustom = "user")]
public ActionResult Index()
{
    return View();
}

Изменение в зависимости от пользователя обрабатывается в Global.asax.cs для проверки значения cookie пользователя, чтобы кэширование изменялось в зависимости от того, вошел ли пользователь в систему или нет, и каким пользователем он является.

Когда я захожу на эту страницу на своем веб-сервере, я получаю следующие заголовки в ответе:

Cache-Control   public, max-age=120
Content-Type    text/html; charset=utf-8
Content-Encoding    gzip
Expires Sun, 20 Mar 2011 21:50:09 GMT
Last-Modified   Sun, 20 Mar 2011 21:48:09 GMT
Vary    Accept-Encoding
Date    Sun, 20 Mar 2011 21:48:09 GMT
Content-Length  3105

С самого начала значение Vary - Accept-Encoding выглядит неправильно, не должно ли оно отправлять Vary - * вместо этого?

Я также отображаю свойство User.Identity.Name для этого представления, и я замечаю, что даже когда я выйду из системы, он будет отображать имя пользователя, пока не истечет 120 секунд.

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    if (custom.Equals("user", StringComparison.OrdinalIgnoreCase))
    {
        HttpCookie cookie = context.Request.Cookies["user"];
        if (cookie != null)
        {
            return cookie.Value;
        }
    }
    return base.GetVaryByCustomString(context, custom);
}

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

Ответы [ 3 ]

17 голосов
/ 23 июля 2011

IIS может сжать ответ до его кэширования, установив dynamicCompressionBeforeCache="true" в элементе urlCompression в файле web.config. Это приведет к возвращению ожидаемого заголовка Vary:*.

Выдержка из справочника конфигурации IIS об атрибуте dynamicCompressionBeforeCache:

Атрибут dynamicCompressionBeforeCache указывает, будет ли IIS динамически сжимать содержимое, которое не было кэшировано. Когда атрибут dynamicCompressionBeforeCache равен true , IIS динамически сжимает ответ при первом выполнении запроса и ставит в очередь содержимое для сжатия. Последующие запросы обслуживаются динамически, пока сжатый ответ не будет добавлен в каталог кэша. Как только сжатый ответ добавляется в каталог кэша, кэшированный ответ отправляется клиентам для последующих запросов. Если dynamicCompressionBeforeCache равно false , IIS возвращает несжатый ответ до тех пор, пока сжатый ответ не будет добавлен в каталог кэша.

4 голосов
/ 11 мая 2011

Проблема заключалась в динамическом сжатии IIS.Это загрязняет заголовки http.Я решил эту проблему, применив собственное динамическое сжатие с помощью actionfilter.

0 голосов
/ 13 января 2015

Для этого есть Microsoft HotFix , но они не позволят вам просто загрузить исправление.

Вам необходимо заполнить адрес электронной почты, чтобы он отправил его вам иговорит:

  • "Не устанавливайте исправление в производственной среде без предварительного тестирования исправления."
  • "Создайте резервную копию системы или компьютера, который получит исправление перед установкойИсправление. "

Из того, что я вижу, это создает следующие проблемы

  • Нет удаления
  • Требуется перезагрузка
  • Дата последнего изменения обновляется для каждого запроса, даже если он возвращает кэшированную версию

Дополнительная информация:

http://support2.microsoft.com/kb/2877816/en-gb

http://blogs.iis.net/erez/archive/2013/08/02/iis-compression-overrides-the-vary-header.aspx

https://51degrees.com/support/documentation/net/iis-modification

Поэтому тщательно подумайте, прежде чем устанавливать это!

...