2010-02-17 29 views

Trả lời

26

Sử dụng quản lý IIS thêm tiêu đề tùy chỉnh Cache-Control với giá trị no-cache. Điều đó sẽ khiến trình duyệt kiểm tra xem phiên bản XAP đã lưu trong bộ nhớ cache nào là phiên bản mới nhất trước khi sử dụng nó hay không.

+0

Đây là một phản ứng tuyệt vời và tốt hơn nhiều so với nhiều người khác (tôi đã thấy bạn trả lời câu hỏi này nhiều lần). Tôi mới phát triển web, nhưng sau khi đọc hướng dẫn bên dưới ... Tôi có thể thấy đây chính xác là những gì là cần thiết cho bộ nhớ đệm XAP. Nó thực sự là một giải pháp tuyệt vời. [Hướng dẫn về Caching] (http://www.mnot.net/cache_docs/) –

+0

Điều này sẽ không buộc trình duyệt không bao giờ lưu bộ nhớ cache XAP? Hay nó đảm bảo nó chỉ lưu trữ khi XAP giống hệt nhau? –

+0

Có cách nào để thực hiện điều đó thông qua Web.Config không? Dự án của tôi được lưu trữ trong một máy chủ mà tôi không có quyền truy cập vào quản lý IIS. – Marlon

7

Thêm một tham số truy vấn vào URL cho XAP trong phần tử trên trang HTML:?

  • ClientBin/MyApp.xap rev = 1
  • ClientBin/MyApp.xap rev = 2

Nó sẽ bị bỏ qua và ngắt bộ nhớ cache. Trong IE8, có một số công cụ quản lý bộ nhớ cache: Mở các công cụ phát triển:

  • Hãy thử nhớ Cache ... Luôn Làm mới từ Server
  • Hãy thử nhớ Cache ... Rõ ràng có trình duyệt Cache cho tên miền này ...
+0

Số sửa đổi trên tài nguyên tĩnh có thể khá hiệu quả khi các URL tham chiếu chúng được tạo động để bạn có thể thêm các tham chiếu này. Tuy nhiên phải mất khá nhiều cơ sở hạ tầng tùy chỉnh để làm cho điều này xảy ra tự động và không có nhà phát triển phải nhớ nâng cấp số phiên bản theo cách thủ công. Nó trở nên tồi tệ hơn nếu tài nguyên được sử dụng ở nhiều nơi. Vì XAP không có khả năng được yêu cầu ở tần số cao từ một máy khách riêng lẻ, nên đáp ứng "không sửa đổi" không thường xuyên sẽ hấp dẫn hơn. – AnthonyWJones

5

Tạo trình xử lý http tùy chỉnh để xử lý các tệp * .xap và sau đó đặt tùy chọn bộ nhớ đệm của bạn bên trong trình xử lý.

Something như thế này ...

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

Các giải pháp được trình bày here có phần giống với Michael nhưng là tự động và đảm bảo khách hàng sẽ luôn có được một phiên bản mới. Điều này có thể không hiệu quả tùy thuộc vào tình huống của bạn.

Vì Lars nói trong số comments that he is not on Stack Overflow, tôi đang sao chép phản hồi tại đây.

<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

Tôi đã cho phương pháp này một đi và trong khi tôi có thể gỡ lỗi và xem 'param' được xây dựng một cách chính xác, Response.Write viết trong ví dụ của tôi ở trên đầu của thẻ . Bất kỳ ý tưởng nào về cách giải quyết vấn đề này? – dougajmcdonald

+0

Huh ... thật là kỳ quặc. Có lẽ bạn có thể Response.Write toàn bộ thẻ đối tượng bao gồm cả param? – Jedidja

+0

Thật kỳ quặc, tôi đã nghĩ đến việc viết ra toàn bộ điều mà tôi đã làm. Dường như có một khuôn khổ chúng tôi đang sử dụng mà không xử lý response.writes ở vị trí họ đang ở trong dòng aspx/Response. Sẽ gọi điện thoại với họ và xem họ có thể chỉ cho tôi theo hướng viết hay không. Cảm ơn bạn đã phản hồi – dougajmcdonald

2

Tất cả các ví dụ trên đều phụ thuộc vào trình duyệt KHÔNG lưu vào bộ nhớ cache chứa tên xap trick mới .... vì vậy bạn chỉ cần chuyển vấn đề sang một thứ khác. Và họ cũng đang fiendishly phức tạp ....

Tuy nhiên đối với trường hợp gỡ lỗi, ít nhất, thật dễ dàng để viết các đối tượng < > và <param> thẻ trong javascript để tên thay đổi mỗi khi trang html là được sử dụng, cho dù nó được lưu trữ bởi trình duyệt hay không!

<script type="text/javascript"> 
    document.write('<object blah blah >'); 
    document.write('<param name="Source" value="myapp.xap?' 
       + new Date().getTime()+'">'); 
    document.write('</object>'); 
</script> 

Điều này tránh bất kỳ rắc rối nào bạn có thể kiểm soát cài đặt máy chủ và hoạt động tốt bất kể công nghệ máy chủ đang sử dụng.

Lưu ý:. Bạn phải viết các nhóm đối tượng toàn với phương pháp tương tự vì đặt một thẻ script bên trong thẻ đối tượng có nghĩa là "chỉ làm điều này nếu trình duyệt doesnt hỗ trợ các đối tượng

5

Tôi đã thêm một parm truy vấn để đường dẫn của tệp xap, để tôi có thể quản lý nó thông qua Versioning.

Default.aspx mã:

<param 
    name="source" 
    value="ClientBin/MySilverLightApp.xap?xapid<%=XapID %>" /> 

Default.aspx.cs mã:

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

Đó là không phải là rất hiếm chạy vào .XAP bộ nhớ đệm, có nghĩa là mỗi lần bạn triển khai phiên bản mới của ứng dụng Silverlight, trình duyệt không tải xuống tệp .XAP đã cập nhật.

Một giải pháp có thể là thay đổi thuộc tính IIS. Bạn có thể bật “Enable HTTP header Content hết hạn” tùy chọn trên cho file .XAP của bạn bằng cách làm theo các bước:

  1. Mở IIS Manager
  2. Đến “Default Web Site” và tìm trang web cho dự án Silverlight của bạn .
  3. Tìm tệp .XAP trong ClientBin.
  4. Chuyển đến trang thuộc tính của tệp .XAP, trên tab Tiêu đề HTTP, Bật “Bật hết hạn nội dung”, nhấp vào nút radio “Hết hạn ngay lập tức”.
  5. Lưu thay đổi.

Bằng cách này, phiên bản mới nhất .XAP (chỉ khi có tệp .XAP mới nhất) sẽ được tải xuống khi bạn làm mới trang mà không phải đóng trình duyệt.

Hy vọng điều này sẽ hữu ích!

Các vấn đề liên quan