Silverlightを使用しているときに、FirefoxがXAPファイルをキャッシュすることに気付きました。そのため、更新を行うと、ユーザーが古いバージョンを使用してスタックする可能性があります。ブラウザーにXAPファイルを毎回再ダウンロードするように強制する方法はありますか、それとも更新が公開された後にのみ強制的にダウンロードする方法はありますか?または、ブラウザーがXAPファイルを完全にキャッシュしないようにするSilverlight構成の設定はありますか?
ありがとう、ジェフ
クエリ文字列は完全に機能しますが、ユーザーが毎回アプリを再ダウンロードする必要があるため、DateTime.Nowは使用しません。代わりに、以下を使用します。
protected void Page_Load(object sender, EventArgs e)
{
var versionNumber = Assembly.GetExecutingAssembly().GetName().Version.ToString();
this.myApp.Source += "?" + versionNumber;
}
このようにして、AssemblyInfo.csファイルのバージョン番号をインクリメントするだけです。
最も簡単な方法:
<param name="source" value="ClientBin/App.xap?<%= DateTime.Now.Ticks %>" />
これは私がphpで行うことです。 xapファイルの日付/時刻を読み取り、それをパラメーターとしてダウンロードリンクに追加します。このようにして、ブラウザは新しいファイルバージョンを新しいリンクとして認識し、したがってキャッシュには認識しません。
<?php $fdate = date("dHis",filemtime("MyApp.xap")) ?>
<param name="source" value="MyApp.xap?=<?php echo $fdate ?>"/>
シンプルで機能します。また、ダウンロードする更新がない場合、ブラウザーは引き続き正しくキャッシュします。
Web作成者とWebマスター向けのキャッシュチュートリアル が役立つ場合があります。このドキュメントでは、クライアントとサーバーが相互作用するさまざまなキャッシュ(ブラウザー、プロキシ、ゲートウェイ)と、キャッシュを制御する方法について説明します。
私にとって、最良の答えは Chris Cairns からです。 ToStringとGetHashCodeを呼び出して、タイムスタンプのIDを生成し、少し調整しました。
<param name="source" value="ClientBin/App.xap?<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/App.xap")).ToString().GetHashCode()%>" />
正常に動作します!
HTTPヘッダーを送信して、キャッシュされないようにすることができます。
Cache-control: no-cache
Pragma: no-cache
これを行う方法は、使用しているWebサーバーによって異なります。
XAPのタイムスタンプの追加は私にとってはうまくいきました(私はJavaScriptでSLコントロールを追加していますが、これはインラインで同じように簡単に行うことができます):
var appTimestamp = '<%= System.IO.File.GetLastWriteTime(Server.MapPath("ClientBin/MyApp.xap")) %>';
var source = 'ClientBin/MyApp.xap?appTimestamp=' + appTimestamp;
これはテストされ、機能しています。
これを入れてください:
<%
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" />
別の解決策は、タイムスタンプではなく、XAPファイルのバージョンを追加することです。タイムスタンプは毎回変更されます(キャッシュをオフにする場合もあります)。 XAPが更新されたときにのみ変更するようにするには、XAPファイルから情報を取得する必要があります。使用できるもの、おそらくXAPファイルの最後に変更された日付スタンプをまだ調べていますか?
上記の提案を組み合わせることで、これを機能させることができます。
コードビハインドでASP.NETSilverlightコントロールのSourceプロパティを設定し、.xapURLにタイムスタンプを追加します。
Silverlight1.Source = "ClientBin/MyApplication.xap?" + DateTime.Now.ToString( "dd-MM-yy-HH:mm:ss");
オブジェクトタグのソースURLに、XAPファイルの最終書き込み日を追加できます。私の ブログ でコードを確認してください。
また、.XAPファイルがブラウザにダウンロードされるタイミングを制御したいという同じ状況にあります。
検討したいアプローチは、Silverlight分離ストレージを「キャッシュ」として使用して.XAPファイルを保存することです。
このブログをチェックしてください: SilverlightオブジェクトキャッシュとしてのIsolatedStorage
私は使用します このソリューション
<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"
これまでのところ、問題が発生した後、私が見つけた唯一の解決策は、Firefoxのキャッシュをクリアすることです。
より良い解決策ははるかに良いでしょう。
この問題が発生したので、新しいアプリケーションを起動するときに、アセンブリのバージョンを0.0.0.1に設定し、展開ごとに1つずつ更新するだけで、問題が解決したようです。次に、リリース時に1.0.0.0に戻します。
非常に単純なアイデア:偽のクエリ文字列をURLに追加するだけです。
<param name="source" value="app.xap?r12345"/>
ほとんどのサーバーはそれを無視し、ファイルを正常にサーバーする必要があります-サーバーによって異なります。本当に賢くなったら、ホスティングページを動的にして、クエリ文字列にティックカウントまたは日時文字列を自動的に追加することができます。これにより、必要なときにキャッシュを取得できますが、変更があった場合は強制的にダウンロードします。
理想的には、サーバーがこれを実行する必要があります。しかしそうでない場合は...