web-dev-qa-db-ja.com

FirefoxにSilverlightXAPファイルをキャッシュまたは再ダウンロードしないように強制するにはどうすればよいですか?

Silverlightを使用しているときに、FirefoxがXAPファイルをキャッシュすることに気付きました。そのため、更新を行うと、ユーザーが古いバージョンを使用してスタックする可能性があります。ブラウザーにXAPファイルを毎回再ダウンロードするように強制する方法はありますか、それとも更新が公開された後にのみ強制的にダウンロードする方法はありますか?または、ブラウザーがXAPファイルを完全にキャッシュしないようにするSilverlight構成の設定はありますか?

ありがとう、ジェフ

50
Yttrium

クエリ文字列は完全に機能しますが、ユーザーが毎回アプリを再ダウンロードする必要があるため、DateTime.Nowは使用しません。代わりに、以下を使用します。

protected void Page_Load(object sender, EventArgs e)
{
    var versionNumber = Assembly.GetExecutingAssembly().GetName().Version.ToString();
    this.myApp.Source += "?" + versionNumber;
}

このようにして、AssemblyInfo.csファイルのバージョン番号をインクリメントするだけです。

32
Romain

最も簡単な方法:

<param name="source" value="ClientBin/App.xap?<%= DateTime.Now.Ticks %>" />
12
Andy Mehalick

これは私がphpで行うことです。 xapファイルの日付/時刻を読み取り、それをパラメーターとしてダウンロードリンクに追加します。このようにして、ブラウザは新しいファイルバージョンを新しいリンクとして認識し、したがってキャッシュには認識しません。

<?php $fdate = date("dHis",filemtime("MyApp.xap")) ?>

<param name="source" value="MyApp.xap?=<?php echo $fdate ?>"/>

シンプルで機能します。また、ダウンロードする更新がない場合、ブラウザーは引き続き正しくキャッシュします。

6
FlappySocks

Web作成者とWebマスター向けのキャッシュチュートリアル が役立つ場合があります。このドキュメントでは、クライアントとサーバーが相互作用するさまざまなキャッシュ(ブラウザー、プロキシ、ゲートウェイ)と、キャッシュを制御する方法について説明します。

5
converter42

私にとって、最良の答えは Chris Cairns からです。 ToStringとGetHashCodeを呼び出して、タイムスタンプのIDを生成し、少し調整しました。

<param name="source" value="ClientBin/App.xap?<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/App.xap")).ToString().GetHashCode()%>" />

正常に動作します!

5
JwJosefy

HTTPヘッダーを送信して、キャッシュされないようにすることができます。

Cache-control: no-cache
Pragma: no-cache

これを行う方法は、使用しているWebサーバーによって異なります。

4
Jarett Millard

XAPのタイムスタンプの追加は私にとってはうまくいきました(私はJavaScriptでSLコントロールを追加していますが、これはインラインで同じように簡単に行うことができます):

var appTimestamp = '<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/MyApp.xap")) %>';
var source = 'ClientBin/MyApp.xap?appTimestamp=' + appTimestamp;
2
Chris Cairns

これはテストされ、機能しています。

これを入れてください:

<%
    const string sourceValue = @"ClientBin/MyXapFile.xap";
    string param;

    if(System.Diagnostics.Debugger.IsAttached)
        param = "<param name=\"source\" value=\"" + sourceValue + "\" />";
    else
    {
        var xappath = HttpContext.Current.Server.MapPath(@"") + @"\" + sourceValue;
        var xapCreationDate = System.IO.File.GetLastWriteTime(xappath);

        param = "<param name=\"source\" value=\"" + sourceValue + "?ignore="
        + xapCreationDate + "\" />";
    }
    Response.Write(param);
%>

これの代わりに:

<param name="source" value="ClientBin/MyXapFile.xap" />
2
Alexanderius

別の解決策は、タイムスタンプではなく、XAPファイルのバージョンを追加することです。タイムスタンプは毎回変更されます(キャッシュをオフにする場合もあります)。 XAPが更新されたときにのみ変更するようにするには、XAPファイルから情報を取得する必要があります。使用できるもの、おそらくXAPファイルの最後に変更された日付スタンプをまだ調べていますか?

2
Stephen Price

上記の提案を組み合わせることで、これを機能させることができます。

  1. メタタグcache-control/pragmahttp-equiv属性を「No-Cache」に設定します
  2. ASP.NETページを使用して(htmlページではなく)Silverlightコントロールをホストします
  3. コードビハインドでASP.NETSilverlightコントロールのSourceプロパティを設定し、.xapURLにタイムスタンプを追加します。

    Silverlight1.Source = "ClientBin/MyApplication.xap?" + DateTime.Now.ToString( "dd-MM-yy-HH:mm:ss");

1
Phil Steel

オブジェクトタグのソースURLに、XAPファイルの最終書き込み日を追加できます。私の ブログ でコードを確認してください。

1

また、.XAPファイルがブラウザにダウンロードされるタイミングを制御したいという同じ状況にあります。

検討したいアプローチは、Silverlight分離ストレージを「キャッシュ」として使用して.XAPファイルを保存することです。

このブログをチェックしてください: SilverlightオブジェクトキャッシュとしてのIsolatedStorage

0
ptio

私は使用します このソリューション

<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);
%>
<param name="onError" value="onSilverlightError" 
0

これまでのところ、問題が発生した後、私が見つけた唯一の解決策は、Firefoxのキャッシュをクリアすることです。

より良い解決策ははるかに良いでしょう。

0

この問題が発生したので、新しいアプリケーションを起動するときに、アセンブリのバージョンを0.0.0.1に設定し、展開ごとに1つずつ更新するだけで、問題が解決したようです。次に、リリース時に1.0.0.0に戻します。

0
David Casey

非常に単純なアイデア:偽のクエリ文字列をURLに追加するだけです。

<param name="source" value="app.xap?r12345"/>

ほとんどのサーバーはそれを無視し、ファイルを正常にサーバーする必要があります-サーバーによって異なります。本当に賢くなったら、ホスティングページを動的にして、クエリ文字列にティックカウントまたは日時文字列を自動的に追加することができます。これにより、必要なときにキャッシュを取得できますが、変更があった場合は強制的にダウンロードします。

理想的には、サーバーがこれを実行する必要があります。しかしそうでない場合は...

0
Kevin Moore