2012-01-24 24 views
6

Tôi đang triển khai một dịch vụ REST đơn giản với WCF Web API và cố gắng đặt tiêu đề HTTP để lưu trữ các câu trả lời.Bộ nhớ đệm HTTP trong API Web WCF có vẻ không nhất quán trên các trình duyệt

Đối với một GET đơn giản như thế này

http://localhost:49302/my/2 

các tiêu đề phản ứng giống như thế này:

Server: ASP.NET Development Server/10.0.0.0 
Date: Tue, 24 Jan 2012 18:18:44 GMT 
X-AspNet-Version: 4.0.30319 
Content-Length: 233 
Cache-Control: max-age=120 
Vary: Accept 
Expires: Tue, 24 Jan 2012 18:20:44 GMT 
Last-Modified: Tue, 24 Jan 2012 18:18:15 GMT 
Content-Type: application/xml; charset=utf-8 

Mục đích là khách hàng nên bộ nhớ cache nguồn lực cho hai phút.

Tuy nhiên, bằng cách sử dụng WCF Web API thử nghiệm khách hàng, hành vi này là không phù hợp trên các trình duyệt khác nhau:

  • Trong Firefox (9.0.1) yêu cầu được lưu trữ, và lần đầu tiên sau hai phút là một phiên bản mới của tài nguyên được hiển thị. Hành vi này là như mong đợi.
  • Trong Chrome (16.0.912.77 m), tiêu đề bộ nhớ cache không được tôn trọng. Một phiên bản mới của tài nguyên đang được tìm nạp cho mọi yêu cầu GET. Hành vi này không được mong đợi (bởi tôi, ít nhất).
  • Trong Internet Explorer (9) hành vi cũng giống như trong Chrome.

Tại sao Chrome và IE không tôn trọng tiêu đề bộ nhớ cache?

Đây có phải là lỗi trong ứng dụng khách kiểm tra API web của WCF không?

+1

Kiểm tra API web của WCF Khách hàng rất mới nên có thể có lỗi. Bạn có thể kiểm tra trực tiếp với trình duyệt hoặc viết một trang thử nghiệm nhỏ không. – suing

Trả lời

4

Việc lưu vào bộ nhớ đệm khó thực hiện đúng. Thực tế là một trình duyệt có thể bỏ qua chỉ thị bộ nhớ cache chắc chắn không giúp đỡ.

Theo this document IE không bao giờ lưu trữ bất kỳ yêu cầu với một tiêu đề Vary chứa bất cứ điều gì ngoại trừ Accept-Encoding và User-Agent

Nếu tôi thử nghiệm này với một khoảng thời gian 15 giây bộ nhớ cache và tôi chỉ cần thiết lập các MaxAge và MustRevalidate có vẻ như để làm việc tốt với IE9, FireFox và Chrome.

Web API HttpResponseMessage:

result = new HttpResponseMessage<Book>(book); 
result.Headers.CacheControl = new CacheControlHeaderValue(); 
result.Headers.CacheControl.MaxAge = TimeSpan.FromSeconds(15); 
result.Headers.CacheControl.MustRevalidate = true; 
return result; 

tiêu đề đáp ứng:

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/10.0.0.0 
Date: Wed, 25 Jan 2012 09:13:32 GMT 
X-AspNet-Version: 4.0.30319 
Content-Length: 98 
Cache-Control: must-revalidate, max-age=15 
Content-Type: application/json; charset=utf-8 
Connection: Close 

Tôi không chắc chắn những MustRevalidate là thực sự cần thiết nhưng nó được khuyến khích để sử dụng nó. Xem thông số kỹ thuật here.

+0

Đó là một cái nhìn khá thú vị về các trình duyệt bỏ qua chỉ thị bộ nhớ cache. Tuy nhiên, mặc dù tôi đã cắt bớt các tiêu đề của mình để rất gần với các tiêu đề được đăng ở đây, tôi vẫn không thấy Chrome hoặc IE9 lưu vào bộ nhớ cache. –

+0

Tắt chỉ thị bộ nhớ cache chỉ là gợi ý và trình duyệt hoàn toàn miễn phí để bỏ qua nó.Sử dụng phải-revalidate là một gợi ý cho trình duyệt để được chặt chẽ hơn, Không chắc chắn những gì khác nhau. Tôi đã thử nghiệm trên localhost và không sử dụng máy khách thử nghiệm nhưng đã sử dụng một nút trên một trang HTML thông thường với một cuộc gọi jQuery $ .getJSON(). – Maurice

2

Kiểm tra để thay thế localhost bằng "miền thực" để WCF Test Client hoặc Chrome/IE không có bất kỳ thủ thuật đặc biệt nào cho localhost.

+0

Đó thực sự là một gợi ý khá hợp lý, vì tôi đã không nghĩ về điều đó, nhưng than ôi nó không tạo nên sự khác biệt. Tôi vẫn đang chạy trên hộp địa phương của tôi, tuy nhiên, nhưng tôi đã thử với cả tên máy cục bộ của tôi (NETBIOS), cũng như một tên hoàn toàn giống DNS. –

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