? Как мы не дадим IE9 всегда получать устаревшие данные из кэша?
В нашем проекте используются Silverlight 4 и Microsoft Pivot Viewer, который представляет собой инструмент представления данных, работающий в Silverlight.
Microsoft Pivot Viewer облегчает взаимодействие с огромными объемами данных мощными, информативными и увлекательными способами. Microsoft Live Labs попыталась сделать шаг назад и разработать модель взаимодействия, которая учитывала бы сложность и масштаб информации, а не традиционную структуру Интернета.
Модуль в нашем приложении, который использует Siliverlight и Microsoft Pivot Viewer, имеет довольно много проблем с кэшированием.
Модуль в нашем приложении, который использует Siliverlight и Microsoft Pivot Viewer, динамически извлекает изображения во время выполнения, чтобы представить их пользователю в Siliverlight и Microsoft Pivot Viewer.
Проблема в том, что IE9 кэширует изображения в Siliverlight и Microsoft Pivot Viewer.
Заголовки HTTP-ответов в IIS настроены таким образом, что срок действия веб-содержимого истекает немедленно.
Как только вы добавляете какой-либо параметр URL (например, "? V1" или динамически сгенерированный параметр, как в вашем коде), кэширование на стороне клиента отключается браузером, если явно не установлена дата истечения срока действия.
Мы попробовали следующее в файле ASPX хоста Siliverlight и Microsoft Pivot Viewer:
<div id="silverlightControlHost">
<object id="pivotViewer" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="900">
<%
HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
string orgSourceValue = @"ClientBin/SilverlightPivotViewer.xap";
string param;
if (System.Diagnostics.Debugger.IsAttached)
param = "<param name=\"source\" value=\"" + orgSourceValue + "\" />";
else
{
string xappath = HttpContext.Current.Server.MapPath(@"") + @"\" + orgSourceValue;
DateTime xapCreationDate = System.IO.File.GetLastWriteTime(xappath);
param = "<param name=\"source\" value=\"" + orgSourceValue + "?ignore="
+ xapCreationDate.ToString() + "\" />";
}
Response.Write(param);
%>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="4.0.50401.0" />
<param name="autoUpgrade" value="true" />
<param name="initParams" value="cxml=Resources.cxml" />
<a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50401.0" style="text-decoration:none">
<img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
</a>
</object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>
Google Chrome и Mozilla Firefox работают нормально. Однако IE9 дает сбой, потому что он продолжает получать устаревшие данные из кэша для Silverlight.
Наши следующие усилия не смогли решить проблему с кэшированием:
1) IE9 пользователя по-прежнему кэшируется даже после того, как заголовки ответа HTTP в IIS настроены таким образом, что срок действия веб-содержимого немедленно истекает. 2) IE9 пользователя по-прежнему кэшируется даже после того, как мы гарантируем, что к URL Silverlight XAP добавляется динамически генерируемый параметр.
Может ли кто-нибудь сообщить, как нам следует решить проблему?
1 ответ
Очень временное исправление - которое вы можете использовать только во время разработки - это F12 на веб-странице, чтобы вызвать инструменты разработчика. Затем в меню вы выбираете Кэш> Всегда обновлять с сервера.
Хотел бы я знать, как это исправить навсегда.