Silverlight XAP ファイルが Web ブラウザーによってキャッシュされないようにするにはどうすればよいですか?
私がこれをやりたい理由は、開発中にブラウザーのキャッシュを手動でクリアしたくないためです。プログラムによるアプローチのサーバー側を探しています。
Silverlight XAP ファイルが Web ブラウザーによってキャッシュされないようにするにはどうすればよいですか?
私がこれをやりたい理由は、開発中にブラウザーのキャッシュを手動でクリアしたくないためです。プログラムによるアプローチのサーバー側を探しています。
IIS 管理を使用Cache-Control
して、値を持つカスタム ヘッダーを追加しますno-cache
。これにより、ブラウザーは XAP のキャッシュされたバージョンが最新のものであることを使用前に確認します。
HTMLページの要素のXAPのURLにクエリパラメータを追加します。
それは無視され、キャッシュを壊します。IE8には、いくつかのキャッシュ管理ツールがあります。開発者ツールを開きます。
ここで紹介するソリューションは、Michael のソリューションと多少似ていますが、自動化されており、クライアントが常に新しいバージョンを取得することが保証されています。これは、状況によっては非効率的である可能性があります。
Lars は彼のコメントで彼は Stack Overflowに参加していないと言っているので、ここに応答をコピーします。
<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>
バージョン管理で管理できるように、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()
}
}
*.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;
}
}
.XAP キャッシングに遭遇することはあまり珍しくありません。つまり、Silverlight アプリケーションの新しいバージョンを展開するたびに、ブラウザーは更新された .XAP ファイルをダウンロードしません。
解決策の 1 つは、IIS のプロパティを変更することです。次の手順に従って、.XAP ファイルの [コンテンツの有効期限 HTTP ヘッダーを有効にする] オプションを有効にすることができます。
このようにして、ブラウザーを閉じずにページを更新すると、最新の .XAP (最新の .XAP ファイルがある場合のみ) がダウンロードされます。
お役に立てれば!
上記の例はすべて、ブラウザが新しいトリック 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 タグを配置すると、「ブラウザがオブジェクトをサポートしていない場合にのみこれを行う」という意味になるため、同じメソッドでオブジェクト グループ全体を記述する必要があります。