Подтвердить что ты не робот

Создание файла Silverlight XAP истекает из кэша браузера

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

Создайте собственный обработчик 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;
    }
}

Ответ 5

Я добавил 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()
    }
}

Ответ 6

Ну, все приведенные выше примеры зависят от браузера НЕ кэширования 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 внутри тега объекта означает "делать это только в том случае, если браузер не поддерживает объект.

Ответ 7

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

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

  • Откройте диспетчер IIS
  • Перейдите на "Веб-сайт по умолчанию" и найдите веб-сайт для своего проекта Silverlight.
  • Найдите файл .XAP в ClientBin.
  • Перейдите на страницу свойств файла .XAP на вкладке "Заголовки HTTP", включите "Enable Content Expiration", нажмите переключатель "Expire Immediately".
  • Сохраните изменения.

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

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