Заставьте XAP-файл Silverlight истекать из кэша браузера программным путем - PullRequest
24 голосов
/ 17 февраля 2010

Как предотвратить кеширование файла Silverlight XAP веб-браузером?

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

Ответы [ 7 ]

26 голосов
/ 17 февраля 2010

Используя управление IIS, добавьте пользовательский заголовок Cache-Control со значением no-cache. Это заставит браузер проверить, что любая кэшированная версия XAP является самой последней, прежде чем использовать ее.

8 голосов
/ 17 февраля 2010

Добавьте параметр запроса к URL-адресу для XAP в элементе на странице HTML:

  • ClientBin / MyApp.xap? Ред = 1
  • ClientBin / MyApp.xap? Ред = 2

Он будет проигнорирован и сломает кеш. В IE8 есть несколько инструментов управления кешем: Откройте инструменты разработчика:

  • Попробуйте кешировать ... Всегда обновлять с сервера
  • Попробуйте Cache ... Очистить кэш браузера для этого домена ...
6 голосов
/ 25 мая 2011

Представленное здесь решение несколько похоже на решение Майкла, но оно автоматическое и гарантирует, что клиент всегда получит новую версию. Это может быть неэффективным в зависимости от вашей ситуации.

Поскольку Ларс говорит в своих комментариях, что он не в переполнении стека , я копирую ответ здесь.

<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>
5 голосов
/ 29 января 2013

Я добавил параметр запроса к пути к файлу 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()
    }
}
5 голосов
/ 15 февраля 2011

Создайте собственный обработчик 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;
    }
}
2 голосов
/ 19 августа 2013

Нередко запускается кэширование .XAP, что означает, что каждый раз, когда вы развертываете новую версию приложения Silverlight, браузер не загружает обновленный файл .XAP.

Одним из решений может быть изменение свойств IIS. Вы можете включить опцию «Включить HTTP-заголовок истечения срока действия» для вашего файла .XAP, выполнив следующие действия:

  1. Открыть IIS Manager
  2. Перейдите на «Веб-сайт по умолчанию» и найдите веб-сайт для своего проекта Silverlight.
  3. Найдите файл .XAP в ClientBin.
  4. Перейдите на страницу свойств файла .XAP, на вкладке «Заголовки HTTP», включите «Включить истечение срока действия содержимого», нажмите переключатель «Немедленно истечь».
  5. Сохранить изменения.

Таким образом, последняя версия .XAP (только при наличии последней версии файла .XAP) будет загружена при обновлении страницы без необходимости закрытия браузера.

Надеюсь, это поможет!

2 голосов
/ 24 июня 2011

Что ж, все приведенные выше примеры зависят от того, что браузер НЕ кэширует HTML-код, содержащий новое имя трюка xap .... так что вы просто переносите проблему на что-то другое. И они тоже очень сложны ....

Однако для случая отладки, по крайней мере, легко написать теги и

в 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>

Это позволяет избежать хлопот, связанных с настройками сервера, и работает одинаково независимо от используемой серверной технологии.

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

...