IE 8 и кэширование на стороне клиента - PullRequest
7 голосов
/ 02 декабря 2011

История вопроса:

У меня есть веб-портал в .NET 3.5 на веб-сервере IIS 6. В настоящее время существует страница с заданным значением, которая на основе этого значения ищет файл PDF в веб-службе и отображает результаты для пользователя на другой вкладке веб-страницы. Это делается с помощью следующего кода.

 context.Response.ClearContent();
 context.Response.ClearHeaders();
 context.Response.Clear();
 context.Response.AddHeader("Accept-Header", pdfStream.Length.ToString());                                               
 context.Response.ContentType = "application/pdf";
 context.Response.BinaryWrite(pdfStream.ToArray());
 context.Response.Flush();

Это работает и работает годами. Однако у нас возникла проблема, связанная с тем, что конкретному клиенту каждый раз PDF возвращался как один и тот же PDF, пока он не очистил временный интернет-кеш.

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

context.Response.Cache.SetCacheability(HttpCacheability.NoCache);//IE set to not cache
context.Response.Cache.SetNoStore();//Firefox/Chrome not to cache
context.Response.Cache.SetExpires(DateTime.UtcNow); //for safe measure expire it immediately 

После быстрого теста я получил именно то, что ожидал в заголовке ответа.

Cache-Control    no-cache, no-store 
Pragma    no-cache 
Expires    -1 

Проблема:

Так что это пошло вживую. Казалось, все круто в первый день. На следующий день, бэм, у всех начали появляться белые экраны, а PDF не показывался. После дальнейшего расследования я узнал, что это был только IE 6,7,8. Chrome в порядке, Firefox в порядке, сафари в порядке, даже IE 9 в порядке. Не зная, почему это произошло, я отменил изменение и развернул его, и все снова заработало.

Я обыскал все, пытаясь выяснить, почему мои заголовки кэширования, похоже, путали IE 6-8 безрезультатно. Кто-нибудь сталкивался с этим типом проблемы с IE 6-8? Есть ли что-то, что мне не хватает? Спасибо за понимание.

1 Ответ

6 голосов
/ 02 декабря 2011

Я нашел решение.Вот что предупредило меня. Вот ссылка

В основном IE8 (и ниже) имел проблемы с заголовком Cache-Control, если он имел no-cache или store-cache.Я смог обойти эту проблему, в основном разрешив только частное кэширование, и установил максимальный возраст очень коротким, чтобы он истекал почти сразу.

//Ie 8 and lower have an issue with the "Cache-Control no-cache" and "Cache-Control store-cache" headers.
//The work around is allowing private caching only but immediately expire it.
if ((Request.Browser.Browser.ToLower() == "ie") && (Request.Browser.MajorVersion < 9))
{
     context.Response.Cache.SetCacheability(HttpCacheability.Private);
     context.Response.Cache.SetMaxAge(TimeSpan.FromMilliseconds(1));
}
else
{
     context.Response.Cache.SetCacheability(HttpCacheability.NoCache);//IE set to not cache
     context.Response.Cache.SetNoStore();//Firefox/Chrome not to cache
     context.Response.Cache.SetExpires(DateTime.UtcNow); //for safe measure expire it immediately
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...