如何防止Web瀏覽器緩存Silverlight XAP文件?以編程方式使Silverlight XAP文件從瀏覽器緩存中過期
我想這樣做是發展我不想手動清除瀏覽器緩存中的原因,我正在尋找一個編程方法服務器端。
如何防止Web瀏覽器緩存Silverlight XAP文件?以編程方式使Silverlight XAP文件從瀏覽器緩存中過期
我想這樣做是發展我不想手動清除瀏覽器緩存中的原因,我正在尋找一個編程方法服務器端。
使用IIS管理添加值爲no-cache
的自定義標頭Cache-Control
。這會讓瀏覽器在使用XAP之前檢查任何緩存版本的XAP是最新版本。
在元件添加的查詢參數的URL XAP上的HTML頁:?
它會被忽略,並且打破了緩存。 在IE8中,也有一些緩存的管理工具: 打開開發工具:
當引用它們的URL是動態生成的,因此可以添加這些引用時,靜態資源上的修訂號可能非常有效。然而,需要相當多的定製基礎設施來動態實現這一點,而開發人員不得不記得手動升級版本號。如果資源在多個地方使用,情況會變得更糟。由於XAP不可能以高頻率從個人客戶那裏請求,所以偶爾的「未修改」響應更爲合意。 – AnthonyWJones
創建一個用於處理* .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;
}
}
的解決方案呈現here有點類似於邁克爾的,但是是自動的,保證了客戶總是會得到一個新的版本。根據您的情況,此可能效率低下。
由於拉斯說,在他comments that he is not on 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>
我給了這個方法一個去,雖然我可以調試並看到正確構建的'參數',Response.Write寫在我的例子
呃......那很奇怪。也許你可以Response.Write整個對象標籤,包括參數? – Jedidja
確實很奇怪,我想把所有的東西都寫出來,這是我做的。似乎有一個我們正在使用的框架,它不處理它們在aspx/Response流中的位置處的response.writes。會向他們打電話,看他們是否能指出我的寫作方向。感謝您的迴應 – dougajmcdonald
那麼上述所有例子依賴於不緩存包含新把戲XAP名的HTML瀏覽器....所以你只需動的問題到別的東西。 而且他們也惡魔般的複雜....
然而,對於調試情況下,至少,它很容易編寫<對象>和<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>
這回避你可能有控制服務器設置和使用的作品一樣好,無論服務器技術的任何麻煩。
注意:您必須編寫整個對象組用同樣的方法,因爲把一個腳本標記物標記中意思是「只有這樣做,如果瀏覽器犯規支持對象
我添加了一個查詢PARM到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緩存,這意味着每次您部署新版本的Silverlight應用程序,瀏覽器不會下載更新的.XAP文件。
一個解決方案可能是更改IIS屬性。您可以通過以下步驟打開你的.xap文件「啓用內容過期的HTTP標頭」選項:
這樣,當你刷新頁面,而無需關閉瀏覽器的最新.XAP(僅當有一個最新的.xap文件)將得到下載。
希望這會有所幫助!
這是一個很好的迴應,比很多其他人都好(我已經看到你在這裏多次給出這個答案。)我是網絡開發新手,但在閱讀下面的教程後,我可以看到這正是是XAP緩存所必需的。這確實是一個很好的解決方案。 [緩存教程](http://www.mnot.net/cache_docs/) –
這不會強制瀏覽器永不緩存XAP?還是它確保它只在XAP相同時才緩存? –
有沒有辦法通過Web.Config來做到這一點?我的項目託管在服務器上,我無法訪問IIS管理。 – Marlon