2010-02-17 60 views

回答

26

使用IIS管理添加值爲no-cache的自定義標頭Cache-Control。這會讓瀏覽器在使用XAP之前檢查任何緩存版本的XAP是最新版本。

+0

這是一個很好的迴應,比很多其他人都好(我已經看到你在這裏多次給出這個答案。)我是網絡開發新手,但在閱讀下面的教程後,我可以看到這正是是XAP緩存所必需的。這確實是一個很好的解決方案。 [緩存教程](http://www.mnot.net/cache_docs/) –

+0

這不會強制瀏覽器永不緩存XAP?還是它確保它只在XAP相同時才緩存? –

+0

有沒有辦法通過Web.Config來做到這一點?我的項目託管在服務器上,我無法訪問IIS管理。 – Marlon

7

在元件添加的查詢參數的URL XAP上的HTML頁:?

  • 的ClientBin/MyApp.xap轉= 1
  • 的ClientBin/MyApp.xap轉= 2

它會被忽略,並且打破了緩存。 在IE8中,也有一些緩存的管理工具: 打開開發工具:

  • 嘗試緩存...從服務器總是刷新
  • 嘗試緩存清空瀏覽器緩存,該域...
+0

當引用它們的URL是動態生成的,因此可以添加這些引用時,靜態資源上的修訂號可能非常有效。然而,需要相當多的定製基礎設施來動態實現這一點,而開發人員不得不記得手動升級版本號。如果資源在多個地方使用,情況會變得更糟。由於XAP不可能以高頻率從個人客戶那裏請求,所以偶爾的「未修改」響應更爲合意。 – AnthonyWJones

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; 
    } 
} 
6

的解決方案呈現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> 
+0

我給了這個方法一個去,雖然我可以調試並看到正確構建的'參數',Response.Write寫在我的例子標籤的開始上面。任何想法如何解決這一個? – dougajmcdonald

+0

呃......那很奇怪。也許你可以Response.Write整個對象標籤,包括參數? – Jedidja

+0

確實很奇怪,我想把所有的東西都寫出來,這是我做的。似乎有一個我們正在使用的框架,它不處理它們在aspx/Response流中的位置處的response.writes。會向他們打電話,看他們是否能指出我的寫作方向。感謝您的迴應 – dougajmcdonald

2

那麼上述所有例子依賴於不緩存包含新把戲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> 

這回避你可能有控制服務器設置和使用的作品一樣好,無論服務器技術的任何麻煩。

注意:您必須編寫整個對象組用同樣的方法,因爲把一個腳本標記物標記中意思是「只有這樣做,如果瀏覽器犯規支持對象

5

我添加了一個查詢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() 
    } 
} 
2

這不是很罕見碰上.XAP緩存,這意味着每次您部署新版本的Silverlight應用程序,瀏覽器不會下載更新的.XAP文件。

一個解決方案可能是更改IIS屬性。您可以通過以下步驟打開你的.xap文件「啓用內容過期的HTTP標頭」選項:

  1. 打開IIS管理器
  2. 進入「默認Web站點」,找到網站,爲您的Silverlight項目。
  3. 找到ClientBin下的.XAP文件。
  4. 轉到.XAP文件的屬性頁,在HTTP Headers選項卡上,打開「啓用內容過期」,單擊「立即過期」單選按鈕。
  5. 保存更改。

這樣,當你刷新頁面,而無需關閉瀏覽器的最新.XAP(僅當有一個最新的.xap文件)將得到下載。

希望這會有所幫助!

相關問題