2014-09-08 17 views
5

Ứng dụng của tôi sử dụng ASP.NET MVC 5 với OutputCache (chi tiết, chúng tôi sử dụng MVCDonutCaching) để lưu các trang web có lưu lượng truy cập cao và các tuyến tốn kém.ASP.NET MVC OutputCache không lưu trữ tiêu đề tùy chỉnh

Một số hành động có Bộ lọc hành động tùy chỉnh bổ sung tiêu đề Content-Range tùy thuộc vào kiểu xem. Không có bộ nhớ đệm, nó hoạt động như sự quyến rũ. Khi bộ nhớ cache được bật, lần truy cập đầu tiên là ok (Content-Range tiêu đề có trong phản hồi) - nhưng thứ hai chỉ chứa Content-Type và phản hồi HTML/JSON và tiêu đề tùy chỉnh Content-Range của chúng tôi bị thiếu (vi phạm chức năng khách hàng).

Có cách nào để kích hoạt bộ nhớ đệm tiêu đề thích hợp mà không cần viết một triển khai OutputCache riêng không?

Cảm ơn bạn rất nhiều.

+0

Ngay cả khi yêu cầu hoặc sử dụng yêu cầu được lưu trong bộ nhớ cache cục bộ, tập hợp OutputCache là gì? – Lloyd

+0

Yêu cầu được gửi đến máy chủ và được trả lời. Yêu cầu đi qua định tuyến và dừng lại trên 'DonutOutputCache' ActionFilter phục vụ bản sao của Nội dung gốc của Http, đặt loại nội dung và một số tiêu đề bộ nhớ cache. –

+0

Chú thích bộ lọc hành động tiêu đề tùy chỉnh trước hoặc sau chú thích bộ nhớ cache đầu ra? – Carl

Trả lời

1

Phản hồi được lưu trong bộ nhớ cache là phản hồi HTTP "304 - Không được sửa đổi" và loại phản hồi đó không được mong đợi trả về tiêu đề thực thể (ngoại trừ một số ngoại lệ như "Sửa đổi lần cuối").

Các "Content-Phạm vi" tiêu đề bạn đang cố gắng để trở lại là một tiêu đề thực thể:

http://www.freesoft.org/CIE/RFC/2068/178.htm

Dưới đây là một danh sách đầy đủ các tiêu đề Entity:

https://tools.ietf.org/html/rfc2616#section-7.1

Lý do lý do tại sao 304 không trả lại tiêu đề thực thể là phản ứng 304 không được phép trả về một đại diện đầy đủ của tài nguyên đích, vì không có gì thay đổi.

Các 304 (Không thay đổi) mã trạng thái chỉ ra rằng một điều kiện GET hoặc HEAD yêu cầu đã được nhận và sẽ có kết quả trong một phản ứng 200 (OK) nếu nó không được cho thực tế rằng tình trạng này có được đánh giá là sai. Nói cách khác, không cần máy chủ để chuyển đại diện của tài nguyên đích vì yêu cầu cho biết rằng khách hàng đã đưa ra yêu cầu có điều kiện, đã có đại diện hợp lệ;

Điều đó có nghĩa là các tiêu đề thực thể không được chuyển lại. Điều này đảm bảo tính nhất quán và cũng có một số lợi ích về hiệu suất.

Nếu GET có điều kiện sử dụng trình xác thực bộ nhớ cache mạnh (xem phần 13.3.3), câu trả lời KHÔNG NÊN bao gồm các tiêu đề thực thể khác. Ngược lại (tức là, GET có điều kiện đã sử dụng trình xác nhận yếu), câu trả lời PHẢI KHÔNG bao gồm các tiêu đề thực thể khác; điều này ngăn không nhất quán giữa các thực thể được lưu trong bộ nhớ cache và các tiêu đề được cập nhật.

https://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-23#section-4.1

Kết luận của tôi là ASP.NET và IIS được giải thích đặc điểm kỹ thuật này một cách chính xác, và những gì bạn đang cố gắng làm là không được hỗ trợ. Một chứng minh cho rằng đó là Apache, và các máy chủ web phổ biến khác làm tương tự như đã giải thích ở trên.

Nếu bạn vẫn cần tiêu đề đó trong 304, bạn sẽ phải xác định và thay thế (nếu có thể) các thành phần chịu trách nhiệm lọc 304 câu trả lời.

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