2009-02-18 35 views
5

Bắt rất bối rối về tiêu đề 'Hết hạn' tại đây! Đôi khi nó hoạt động như mong đợi - và đôi khi không.Hết hạn tiêu đề khi thử nghiệm trong Chrome

Tôi đang sử dụng mã sau để đặt tiêu đề hết hạn của mình. Lưu ý điều này đang được thực hiện với ASP.NET trong một thuộc tính tùy chỉnh MVC - thats không thực sự có liên quan ở đây - nhưng giải thích nơi 'filterContext' là đến từ.

HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration); 

// my own custom header so we know what time it was 
filterContext.HttpContext.Response.AddHeader("CurrentTime", DateTime.Now.ToString()); 

cache.SetCacheability(HttpCacheability.Public); 
cache.SetExpires(DateTime.Now.Add(cacheDuration)); 
cache.SetMaxAge(cacheDuration); 
cache.AppendCacheExtension("must-revalidate, proxy-revalidate"); 

Điều này đôi khi sẽ cho tôi tiêu đề như thế này:

Cache-Control: public, must-revalidate, proxy-revalidate, max-age=413 
Date: Wed, 18 Feb 2009 05:24:19 GMT 
Expires: Wed, 18 Feb 2009 05:21:12 GMT 
CurrentTime: 2/17/2009 9:21:12 PM 

Đôi khi như thế này:

Cache-Control: public, must-revalidate, proxy-revalidate, max-age=600 
Date: Wed, 18 Feb 2009 05:27:55 GMT 
Expires: Wed, 18 Feb 2009 05:27:55 GMT 
CurrentTime: 2/17/2009 9:27:55 PM 

Tôi đang chạy tất cả mọi thứ thông qua Fiddler và xem để xem khi mọi thứ được tái yêu cầu và khi họ đến từ bộ nhớ cache của trình duyệt.

Bây giờ điều kỳ lạ là trong IE, bộ nhớ đệm luôn hoạt động như mong đợi. Các liên kết đến phương pháp hành động MVC ASP.NET của tôi xuất hiện trong Fiddler và sau đó khi tôi bấm vào liên kết đó một lần nữa nó đến từ bộ nhớ cache.

Tuy nhiên trong Chrome đôi khi nó sẽ và đôi khi sẽ không đến từ bộ nhớ cache! Bởi đến từ bộ nhớ cache tôi có nghĩa là không có yêu cầu HTTP bổ sung.

Ví dụ một liên kết như thế này:

http://ipv4.fiddler:62669/gallery/mainimage/2 

sẽ đến từ bộ nhớ cache trong IE, nhưng trở lại với một 200 trong chrome. Sau đó, đôi khi trong Chrome nó DO đến từ bộ nhớ cache. Tôi đã thử xóa bộ nhớ cache của trình duyệt và thử lại - cùng một kết quả mỗi lần.

Chrome đang cố gắng làm điều gì đó 'thông minh' và chỉ thất bại thảm hại - hay tôi cần thêm tiêu đề?

Điều tôi đang tự hỏi là liệu nó có liên quan gì đến thực tế là ngày tiêu đề Expires của tôi không bao giờ thực sự trong tương lai. nếu tôi nhìn vào tiêu đề của google cho hosted jQuery file của tôi, tôi thấy rằng các tiêu đề như sau (với Hết hạn ở đây trong năm 2010 - một năm trong tương lai).

Cache-Control: public, max-age=31536000 
Date: Wed, 18 Feb 2009 05:44:53 GMT 
Expires: Thu, 18 Feb 2010 05:44:53 GMT 

Không nên hết hạn trong tương lai ??

Theo HTTP spec:

Nếu một phản ứng bao gồm cả một Expires header và một chỉ thị max-age, các chỉ max-age đè Expires tiêu đề, ngay cả khi Expires tiêu đề là hạn chế hơn. Quy tắc này cho phép máy chủ nguồn cung cấp, cho một phản hồi nhất định, thời gian hết hạn là thời gian hết hạn cho bộ nhớ cache HTTP/1.1 (hoặc sau) so với bộ nhớ cache HTTP/1.0 . Điều này có thể hữu ích nếu một số bộ đệm HTTP/1.0 nhất định HTTP/1.0 tính không đúng cách độ tuổi hoặc thời gian hết hạn, có thể là do cho đồng hồ không đồng bộ.

Do đó có vẻ như Chrome nên tôn trọng chỉ thị độ tuổi tối đa ngay cả khi 'Hết hạn' giống như thời gian hiện tại nhưng dường như không làm điều đó.

Trả lời

3

tôi tìm thấy những điều sau trong mã nguồn ASP.NET MVC:

public virtual void RenderView(ViewContext viewContext) { 
     // TODO: Remove this hack. Without it, the browser appears to always load cached output 
     viewContext.HttpContext.Response.Cache.SetExpires(DateTime.Now); 
     ViewUserControlContainerPage containerPage = new ViewUserControlContainerPage(this); 
     // Tracing requires Page IDs to be unique. 
     ID = Guid.NewGuid().ToString(); 

     RenderViewAndRestoreContentType(containerPage, viewContext); 
    } 

Vì vậy, điều này giải thích tại sao Expires phần đầu của tôi luôn luôn là thời gian hiện tại. Tuy nhiên tôi thực sự không nghĩ rằng đây là những gì đang vấp lên Chrome vì tôi đã tạo ra trang đơn giản nhất như sau, và Chrome vẫn còn khá vui vẻ đi lại cho máy chủ và đem lại cho tôi một 200

public partial class test : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     TimeSpan cacheDuration = TimeSpan.FromSeconds(33); 
     var cache = Response.Cache; 

     cache.SetCacheability(HttpCacheability.Public); 
     cache.SetExpires(DateTime.Now.Add(cacheDuration)); 
     cache.SetMaxAge(cacheDuration); 
     cache.AppendCacheExtension("must-revalidate, proxy-revalidate"); 
    } 
} 
+0

tôi thậm chí còn thêm <% = DateTime.Now.ToString()%> vào trang aspx này và chạy nó trên mạng và nó vẫn quay trở lại MỌI THỜI GIAN với 200 và cập nhật thời gian. nhưng trong IE nó được lưu trữ trong 33 giây. sai lầm –

1

Tôi đã khá nhiều kết luận rằng Chrome đang làm điều gì đó thực sự thực sự đáng sợ với bộ nhớ đệm.

Tôi đã đơn giản hóa nó ở cấp độ thấp nhất có thể - nhận jQuery từ máy chủ của Google.

tôi gõ vào:

http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js 

Chrome, và Fiddler đã đưa ra những điều sau yêu cầu:

Requests started at: 22:58:00:7756 
Responses completed at: 22:58:03:5020 
Total Sequence time: 00:00:02.7263880 
DNS Lookup time: 531ms 
TCP/IP Connect time: 63ms 

RESPONSE CODES 
-------------- 
HTTP/200: 1 

Các tiêu đề như sau (lưu ý Hết hạn là 1 năm sau ngày hôm nay):

Cache-Control: public, max-age=31536000 
Date: Wed, 18 Feb 2009 06:58:01 GMT 
Expires: Thu, 18 Feb 2010 06:58:01 GMT 
Vary: Accept-Encoding 

và sau đó tôi đợi một vài giây conds và nhấn enter - trong cùng một tab. Fiddler đã đưa ra một yêu cầu 200 * **:

Requests started at: 22:58:09:2516 
Responses completed at: 22:58:12:3999 
Total Sequence time: 00:00:03.1482360 

RESPONSE CODES 
-------------- 
HTTP/200: 1 

Và các tiêu đề là:

Cache-Control: public, max-age=31536000 
Date: Wed, 18 Feb 2009 06:58:09 GMT 
Expires: Thu, 18 Feb 2010 06:58:09 GMT 
Vary: Accept-Encoding 

Rõ ràng đây là KHÔNG những gì tôi mong đợi.

- Chấp nhận mã hóa giống nhau cho cả hai yêu cầu.

- Yêu cầu thứ ba đã cho tôi một 304

Đây là trên mới cài đặt của Chrome mà tôi chưa bao giờ thực hiện bất kỳ phát triển trên - và trên đó tôi chỉ mới cài đặt Fiddler cho là người đầu tiên thời gian.

Tôi không thể chờ ai đó giải thích điều đó với tôi. Bây giờ tôi từ bỏ - Tôi nghĩ rằng bộ nhớ đệm và mã hết hạn của tôi là tốt. Ngoài ra ASP.NET MVC dường như đang buộc hết hạn là thời gian hiện tại. Điều này rõ ràng không phải là một yếu tố trong ví dụ google của tôi.

Tôi nghĩ Chrome đang quá thông minh và điều này phải là một lỗi - Tôi đang sử dụng phiên bản 1.0.154.48.

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