Заставить XAP-файл Silverlight истекать из кэша браузера программным путем
Как сделать, чтобы веб-браузер не кэшировал файл Silverlight XAP?
Причина, по которой я хочу это сделать, заключается в том, что во время разработки я не хочу очищать кеш браузера вручную, я ищу программный подход на стороне сервера.
7 ответов
Использование управления IIS добавить пользовательский заголовок Cache-Control
со значением no-cache
, Это заставит браузер проверить, что любая кэшированная версия XAP является самой последней, прежде чем использовать ее.
Добавьте параметр запроса в URL для XAP в элементе на странице HTML:
- ClientBin/MyApp.xap? ред =1
- ClientBin/MyApp.xap? ред =2
Это будет игнорироваться и сломать кеш. В IE8 есть несколько инструментов управления кешем: Откройте инструменты разработчика:
- Попробуйте Cache... Всегда обновлять с сервера
- Попробуйте Cache... Очистить кэш браузера для этого домена...
Представленное здесь решение несколько похоже на решение Майкла, но оно автоматическое и гарантирует, что клиент всегда получит новую версию. Это может быть неэффективно в зависимости от вашей ситуации.
Поскольку Ларс говорит в своих комментариях, что он не в переполнении стека, я копирую ответ здесь.
<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>
Я добавил параметр parm в путь к файлу xap, чтобы управлять им через управление версиями.
КодDefault.aspx:
<param
name="source"
value="ClientBin/MySilverLightApp.xap?xapid<%=XapID %>" />
КодDefault.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()
}
}
Создайте собственный обработчик 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;
}
}
Все вышеприведенные примеры зависят от того, что браузер НЕ кэширует HTML-код, содержащий новое имя xap трюка... так что вы просто перенесете проблему на что-то другое. И они тоже чертовски сложные....
Однако для случая отладки, по крайней мере, легко написать теги
<script type="text/javascript">
document.write('<object blah blah >');
document.write('<param name="Source" value="myapp.xap?'
+ new Date().getTime()+'">');
document.write('</object>');
</script>
Это позволяет избежать хлопот, связанных с настройками сервера, и работает одинаково хорошо независимо от используемой технологии сервера.
Примечание: вы должны написать всю группу объектов одним и тем же методом, потому что размещение тега скрипта внутри тега объекта означает "делать это только в том случае, если браузер не поддерживает объект.
Нередко запускается кэширование.XAP, что означает, что каждый раз, когда вы развертываете новую версию приложения Silverlight, браузер не загружает обновленный файл.XAP.
Одним из решений может быть изменение свойств IIS. Вы можете включить опцию "Enable HTTP Expiration HTTP header" для вашего файла.XAP, выполнив следующие действия:
- Открыть IIS Manager
- Перейдите на "Веб-сайт по умолчанию" и найдите веб-сайт для вашего проекта Silverlight.
- Найдите файл.XAP в ClientBin.
- Перейдите на страницу свойств файла.XAP, на вкладке "Заголовки HTTP", включите "Включить истечение срока действия содержимого", нажмите радиокнопку "Немедленно истечь".
- Сохраните изменения.
Таким образом, последняя версия.XAP (только при наличии последней версии файла.XAP) будет загружена при обновлении страницы без необходимости закрытия браузера.
Надеюсь это поможет!