Ответ 1
Проблема заключалась в динамическом сжатии IIS. Он замалчивает заголовки http. Я решил это, скопировав собственное динамическое сжатие с помощью actionfilter.
У меня есть проект asp.net mvc 3, и у меня есть домашний контроллер. Я пометил действие своего индекса с помощью этого атрибута:
[OutputCache(Location = System.Web.UI.OutputCacheLocation.Any, Duration = 120, VaryByParam = "*", VaryByCustom = "user")]
public ActionResult Index()
{
return View();
}
В Google 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);
}
Играл с этим несколько часов, и я полностью застрял, надеюсь, у кого-то есть идея...
Проблема заключалась в динамическом сжатии IIS. Он замалчивает заголовки http. Я решил это, скопировав собственное динамическое сжатие с помощью actionfilter.
Вы можете заставить IIS сжать ответ до того, как он будет кэшироваться, установив dynamicCompressionBeforeCache="true"
в элементе urlCompression в вашем web.config. Это приведет к возврату ожидаемого заголовка Vary:*
.
Выдержка из IIS Configuration Reference об атрибуте dynamicCompressionBeforeCache:
Атрибут dynamicCompressionBeforeCache указывает, будет ли IIS динамически сжимать содержимое, которое не было кэшировано. Если атрибут dynamicCompressionBeforeCache true, IIS динамически сжимает ответ при первом запросе и ставит в очередь содержимое для сжатия. Последующие запросы обслуживаются динамически, пока сжатый ответ не будет добавлен в каталог кэша. Как только сжатый ответ добавляется в каталог кэша, кешированный ответ отправляется клиентам для последующих запросов. Когда dynamicCompressionBeforeCache false, IIS возвращает несжатый ответ до тех пор, пока сжатый ответ не будет добавлен в каталог кэша.
Для этого есть 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
Поэтому тщательно подумайте, прежде чем устанавливать это!