Как сделать, чтобы файл Silverlight XAP не был кэширован веб-браузером?
Причина, по которой я хочу это сделать, во время разработки. Я не хочу вручную очищать кеш браузера, я ищу программную сторону на стороне сервера.
Как сделать, чтобы файл Silverlight XAP не был кэширован веб-браузером?
Причина, по которой я хочу это сделать, во время разработки. Я не хочу вручную очищать кеш браузера, я ищу программную сторону на стороне сервера.
С помощью управления IIS добавьте настраиваемый заголовок Cache-Control
со значением no-cache
. Это заставит браузер проверить, что любая кешированная версия XAP является последней, прежде чем использовать ее.
Добавьте параметр запроса в URL-адрес для XAP в элементе HTML-страницы:
Он будет проигнорирован и сломает кеш. В IE8 есть некоторые инструменты управления кэшем: Откройте инструменты разработчика:
Решение, представленное здесь здесь, похоже на Майкла, но является автоматическим и гарантирует, что клиент всегда получит новую версию. Это может быть неэффективным в зависимости от вашей ситуации.
Поскольку Ларс в своих комментариях говорит, что он не находится в переполнении стека, я копирую здесь ответ.
<object id="Xaml1" data="data:application/x-silverlight-2,
"type="application/x-silverlight-2" width="100%" height="100%">
<%––<param name="source" value="ClientBin/SilverlightApp.xap"/>––%>
<%
string orgSourceValue = @"ClientBin/SilverlightApp.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);
%>
....
</object>
Создайте собственный обработчик http для обработки *.xap файлов, а затем установите параметры кэширования внутри обработчика.
Что-то вроде этого...
using System;
using System.IO;
using System.Web;
public class FileCacheHandler : IHttpHandler
{
public virtual void ProcessRequest(HttpContext context)
{
if (File.Exists(context.Request.PhysicalPath))
{
DateTime lastWriteTime = File.GetLastWriteTime(filePath);
DateTime? modifiedSinceHeader = GetModifiedSinceHeader(context.Request);
if (modifiedSinceHeader == null || lastWriteTime > modifiedSinceHeader)
{
context.Response.AddFileDependency(filePath);
context.Response.Cache.SetLastModifiedFromFileDependencies();
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.TransmitFile(filePath);
context.Response.StatusCode = 200;
context.Response.ContentType = "application/x-silverlight-app";
context.Response.OutputStream.Flush();
}
else
{
context.Response.StatusCode = 304;
}
}
}
public DateTime? GetModifiedSinceHeader(HttpRequest request)
{
string modifiedSinceHeader = request.Headers["If-Modified-Since"];
DateTime modifiedSince;
if (string.IsNullOrEmpty(modifiedSinceHeader)
|| modifiedSinceHeader.Length == 0
|| !DateTime.TryParse(modifiedSinceHeader, out modifiedSince))
return null;
return modifiedSince;
}
}
Я добавил parm к пути к файлу xap, чтобы я мог управлять им через Versioning.
Код Default.aspx:
<param
name="source"
value="ClientBin/MySilverLightApp.xap?xapid<%=XapID %>" />
Код по умолчанию .aspx.cs:
protected string XapID
{
get
{
Version v = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
if (System.Diagnostics.Debugger.IsAttached)
Response.Write(string.Format("Build: {0}.{1}.{2}.{3}", v.Major.ToString(), v.Minor.ToString(), v.Build.ToString(), v.Revision.ToString()));
return string.Format("{0}.{1}.{2}.{3}", v.Major.ToString(), v.Minor.ToString(), v.Build.ToString(), v.Revision.ToString()
}
}
Ну, все приведенные выше примеры зависят от браузера НЕ кэширования HTML, который содержит новое имя трюка xap.... так что вы просто переместите проблему на что-то другое. И они также ужасно сложны....
Однако для случая отладки, по крайней мере, легко написать <object> и <param> теги в javascript, так что имя изменяется каждый раз, когда используется html-страница, независимо от того, кэшируется ли она браузером или нет!
<script type="text/javascript">
document.write('<object blah blah >');
document.write('<param name="Source" value="myapp.xap?'
+ new Date().getTime()+'">');
document.write('</object>');
</script>
Это позволяет избежать любых проблем, с которыми вы можете управлять настройками сервера, и работает так же хорошо, независимо от используемой серверной технологии.
Примечание: вам нужно написать всю группу объектов с помощью того же метода, потому что размещение тега script внутри тега объекта означает "делать это только в том случае, если браузер не поддерживает объект.
Не так уж и необычно запускать кэширование .XAP, а это означает, что каждый раз, когда вы развертываете новую версию приложения Silverlight, браузер не загружает обновленный файл .XAP.
Одним из решений может быть изменение свойств IIS. Вы можете включить параметр HTTP Enable Content Expiration HTTP header для вашего .XAP файла, выполнив следующие шаги:
Таким образом, последний обновленный .XAP(только если есть последний файл .XAP) будет загружен при обновлении вашей страницы без закрытия браузера.
Надеюсь, это поможет!