24

Silverlight XAP ファイルが Web ブラウザーによってキャッシュされないようにするにはどうすればよいですか?

私がこれをやりたい理由は、開発中にブラウザーのキャッシュを手動でクリアしたくないためです。プログラムによるアプローチのサーバー側を探しています。

4

7 に答える 7

26

IIS 管理を使用Cache-Controlして、値を持つカスタム ヘッダーを追加しますno-cache。これにより、ブラウザーは XAP のキャッシュされたバージョンが最新のものであることを使用前に確認します。

于 2010-02-17T15:58:53.157 に答える
8

HTMLページの要素のXAPのURLにクエリパラメータを追加します。

  • clientBin / MyApp.xap?rev = 1
  • clientBin / MyApp.xap?rev = 2

それは無視され、キャッシュを壊します。IE8には、いくつかのキャッシュ管理ツールがあります。開発者ツールを開きます。

  • キャッシュを試してください...常にサーバーから更新してください
  • キャッシュを試してください...このドメインのブラウザキャッシュをクリアしてください...
于 2010-02-17T15:41:08.533 に答える
6

ここで紹介するソリューションは、Michael のソリューションと多少似ていますが、自動化されており、クライアントが常に新しいバージョンを取得することが保証されています。これ、状況によっては非効率的である可能性があります。

Lars は彼のコメントで彼は Stack Overflowに参加していないと言っているので、ここに応答をコピーします。

<object id="Xaml1" data="data:application/x-silverlight-2,
    "type="application/x-silverlight-2" width="100%" height="100%">

  <%––&lt;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>
于 2011-05-25T19:31:43.137 に答える
5

バージョン管理で管理できるように、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()
    }
}
于 2013-01-29T16:55:01.683 に答える
5

*.xap ファイルを処理するためのカスタム http ハンドラーを作成し、ハンドラー内でキャッシュ オプションを設定します。

このようなもの...

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;
    }
}
于 2011-02-14T21:17:34.830 に答える
2

.XAP キャッシングに遭遇することはあまり珍しくありません。つまり、Silverlight アプリケーションの新しいバージョンを展開するたびに、ブラウザーは更新された .XAP ファイルをダウンロードしません。

解決策の 1 つは、IIS のプロパティを変更することです。次の手順に従って、.XAP ファイルの [コンテンツの有効期限 HTTP ヘッダーを有効にする] オプションを有効にすることができます。

  1. IIS マネージャーを開く
  2. 「既定の Web サイト」に移動し、Silverlight プロジェクトの Web サイトを見つけます。
  3. ClientBin で .XAP ファイルを見つけます。
  4. .XAP ファイルのプロパティ ページに移動し、[HTTP ヘッダー] タブで [コンテンツの有効期限を有効にする] をオンにし、[すぐに期限切れにする] ラジオ ボタンをクリックします。
  5. 変更を保存します。

このようにして、ブラウザーを閉じずにページを更新すると、最新の .XAP (最新の .XAP ファイルがある場合のみ) がダウンロードされます。

お役に立てれば!

于 2013-08-19T06:55:39.060 に答える
2

上記の例はすべて、ブラウザが新しいトリック xap 名を含む HTML をキャッシュしていないことに依存しています。そして、それらは非常に複雑でもあります....

ただし、少なくともデバッグの場合は、<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>

これにより、サーバー設定を制御する手間が省け、使用しているサーバー テクノロジに関係なく機能します。

注: object タグ内に script タグを配置すると、「ブラウザがオブジェクトをサポートしていない場合にのみこれを行う」という意味になるため、同じメソッドでオブジェクト グループ全体を記述する必要があります。

于 2011-06-23T20:59:09.950 に答える