Tôi có một phương pháp hành động mà tôi muốn bộ nhớ cache:OutputCache đang gửi sai tiêu đề Vary khi cuộc gọi lượt truy cập bộ nhớ cache
[OutputCache(Duration=60*5, Location=OutputCacheLocation.Any, VaryByCustom="index")]
public ActionResult Index()
{
return View();
}
Với phương pháp này:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
context.Response.Cache.SetOmitVaryStar(true);
context.Response.Cache.VaryByHeaders["Cookie"] = true;
if (User.Identity.IsAuthenticated)
{
Debug.Print("Authenticated");
context.Response.Cache.SetNoServerCaching();
context.Response.Cache.SetCacheability(HttpCacheability.Private);
return null;
}
else
{
Debug.Print("Non authenticated");
return custom;
}
}
Ý tưởng là để keep a cached version of the page for non-authenticated users, but avoid caching for authenticated ones.
Tôi nghĩ rằng nó sẽ luôn trả về tiêu đề HTTP Vary:Cookie
, nhưng không phải. Làm một thử nghiệm với Fiddler và phát hành hai lần cùng một yêu cầu, trong HTTP đầu tiên gọi nó đi tốt:
HTTP/1.1 200 OK
Cache-Control: public, max-age=300
Content-Type: text/html; charset=utf-8
Expires: Thu, 09 Feb 2012 10:53:36 GMT
Last-Modified: Thu, 09 Feb 2012 10:48:36 GMT
Vary: Cookie
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2012 10:48:37 GMT
Content-Length: 441
Nhưng trong một giây, nó ghi đè header:
HTTP/1.1 200 OK
Cache-Control: public, max-age=297
Content-Type: text/html; charset=utf-8
Expires: Thu, 09 Feb 2012 10:53:36 GMT
Last-Modified: Thu, 09 Feb 2012 10:48:36 GMT
Vary: *
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2012 10:48:39 GMT
Content-Length: 441
Vì vậy, khi theo tôi biết, các trình duyệt sẽ không lưu lại yêu cầu ngay cả khi nó được công khai, vì Vary:*
có nghĩa là yêu cầu đã được tạo với các tham số không có trong URL cũng như trong các tiêu đề HTTP. Có cách nào để sửa lỗi này?
Trân trọng.
UPDATE:
Theo cách tương tự, khi tôi gửi hai yêu cầu chứng thực giống hệt nhau, cuộc gọi đầu tiên nhận được private
sửa đổi, nhưng không phải là Vary
tiêu đề:
HTTP/1.1 200 OK
Cache-Control: private, max-age=300
Content-Type: text/html; charset=utf-8
Expires: Thu, 09 Feb 2012 12:43:14 GMT
Last-Modified: Thu, 09 Feb 2012 12:38:14 GMT
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2012 12:38:14 GMT
Content-Length: 443
Nhưng điều thứ hai nhận được phản hồi tương tự rằng yêu cầu không được xác thực:
HTTP/1.1 200 OK
Cache-Control: public, max-age=298
Content-Type: text/html; charset=utf-8
Expires: Thu, 09 Feb 2012 12:44:32 GMT
Last-Modified: Thu, 09 Feb 2012 12:39:32 GMT
Vary: *
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2012 12:39:33 GMT
Content-Length: 443
Tôi đã tải lên một số test project showing the issue vì vậy có thể bạn muốn dùng thử.
Hãy lưu ý rằng có IHttpModule
đặt yêu cầu được xác thực hoặc không phụ thuộc vào yêu cầu có cookie hay không, đây không phải là phương pháp "thực tế", nó chỉ dành cho mục đích thử nghiệm.
Dự án chỉ chứa một trang web với một liên kết đến bản thân, một liên kết mà các bản ghi bạn vào, và một đường link khác mà các bản ghi bạn ra ngoài:
- đăng nhập: Gửi một cookie trong một chuyển hướng
HTTP 302
đến nhà một lần nữa. - LogOut: Gửi lại cookie đã hết hạn trong một lần truy cập
HTTP 302
về trang chủ.
Các dự kiến / lý tưởng hành vi sẽ là: truy cập
- tài Index, và nhận được trang từ máy chủ. Ngày hiển thị trang "A".
- Truy cập lại người dùng Chỉ mục và trình duyệt hiển thị phiên bản được lưu trong bộ nhớ cache. Trang hiển thị ngày "A".
- Làm sạch bộ nhớ cache của trình duyệt.
- Truy cập lại người dùng Chỉ mục và trình duyệt hiển thị phiên bản được lưu trong bộ nhớ cache của máy chủ. Ngày hiển thị trang "A".
- Thông tin đăng nhập của người dùng và broswer nhận được một trang mới, hiển thị ngày "B".
- Đăng xuất nhấp chuột của người dùng và trình duyệt nhận được trang được lưu trong bộ nhớ cache của máy chủ. Trang hiển thị ngày "A" một lần nữa.
Nhưng đây là hành vi cho đến nay:
- truy cập tài khoản Index, và nhận được trang từ máy chủ. Ngày hiển thị trang "A".
- Truy cập lại người dùng Chỉ mục và trình duyệt hiển thị phiên bản được lưu trong bộ nhớ cache. Trang hiển thị ngày "A".
- Làm sạch bộ nhớ cache của trình duyệt.
- Truy cập lại người dùng Chỉ mục và trình duyệt hiển thị phiên bản được lưu trong bộ nhớ cache của máy chủ. Ngày hiển thị trang "A".
- Thông tin đăng nhập của người dùng và broswer nhận được một trang mới, hiển thị ngày "B".
- Đăng xuất nhấp chuột của người dùng và trình duyệt sẽ nhận được trang được lưu trong bộ nhớ cache của máy chủ nhưng không phải là. Trang hiển thị ngày "B" một lần nữa từ bộ nhớ cache của trình duyệt. Điều này là do thiếu tiêu đề
Vary
trong phản hồi được xác thực.
Tôi không biết liệu tôi có điều gì sai về bộ nhớ đệm, chỉ thiếu một số chi tiết hoặc OutputCache
không hoạt động tốt, nhưng tôi đánh giá cao mọi hướng dẫn.
Chúc mừng.
UPDATE 2:
Ý định của tôi là sử dụng ngữ nghĩa HTTP bộ nhớ cache để:
- Cho phép trình duyệt và proxys để cache phiên bản "công cộng" của trang.
- Cho phép các trình duyệt lưu vào bộ nhớ cache phiên bản "đã được xác thực" của trang cho người dùng.
Nếu tôi thay đổi tuyên bố OutputCache để làm bộ nhớ đệm chỉ trên máy chủ và ngăn chặn sự hạ lưu và khách hàng bộ nhớ đệm:
[OutputCache(Duration=60*5, Location=OutputCacheLocation.Server, VaryByCustom="index")]
nó cư xử như mong đợi, nhưng bộ nhớ cache hạ lưu và khách hàng được ngăn chặn, và đó không phải là điều tôi muốn.
Điều gì sẽ xảy ra nếu bạn cũng đặt các thuộc tính VaryBy khác trên thuộc tính OutputCache của phương thức? – bzlm
Tôi đã thêm VaryByHeader = "Cookie", và nó vẫn xảy ra, cuộc gọi thứ hai nhận được một Vary = *. – vtortola
Nếu bạn thử [cách tiếp cận được liên kết trong câu hỏi được liên kết] (http://visitmix.com/writings/using-varybycustom-with-outputcache-in-asp-net-mvc-to-support-caching-for- người dùng đã đăng nhập) như hiện tại, không thay đổi từng cookie hoặc sửa đổi tiêu đề phản hồi bên trong phương thức 'GetVaryByCustom'? (Về mặt kỹ thuật, bạn không cần phải thay đổi theo cookie để đạt được bộ nhớ đệm chỉ dành cho người dùng ẩn danh.) – bzlm