2009-07-21 29 views
5

Tôi đang cố gắng hiểu cơ chế ASP.NET OutputCache.
Tôi đã xây dựng một trang thử nghiệm với Nhãn và LinkButton.
Các văn bản nhãn đang được khởi tạo trên máy chủ với ngày máy chủ hiện tại trên mỗi PageLoad:ASP.NET OutputCache và postbacks

protected void Page_Load(object sender, EventArgs e) 
{ 
    lblDate.Text = DateTime.Now.ToString(); 
} 

tôi sử dụng chỉ thị này: <%@ OutputCache Duration="600" VaryByParam="none"%>

Khi tôi bấm LinkButton lần đầu tiên tôi nhận được một văn bản mới trong Nhãn nhưng nếu tôi nhấn nút liên kết một lần nữa, tôi không nhận được văn bản mới.

Tôi giả định điều này là do các thông số đang được chuyển đến máy chủ giống nhau cho mỗi lần đăng lại.

Có cách nào để làm việc với các điều khiển OutputCach và postback không?

Trả lời

6

Đúng vậy, vấn đề là bạn đang thay đổi bởi NO tham số để html đáp ứng yêu cầu đầu tiên được lưu trữ và phục vụ trong 10 phút tiếp theo (theo lý thuyết). Nếu bạn muốn lưu bộ nhớ cache GET nhưng xử lý các POST khác nhau, bạn nên thay đổi theo thông số POST của bạn.

Hãy để tôi cung cấp cho bạn một ví dụ. Bạn có một đầu vào văn bản được sử dụng để gửi email có nội dung trên POST. Nếu bạn thay đổi theo tên đầu vào đó, mỗi yêu cầu trong khoảng thời gian lưu vào bộ nhớ cache với các giá trị khác nhau cho đầu vào văn bản đó sẽ nhấn trình xử lý của bạn và xử lý việc gửi email.

Ở phía bên kia, bạn có thể thay đổi theo * nhưng sau đó bạn sẽ mất chế độ bộ nhớ đệm hạt nhân.

+0

Bạn có thể đăng một ví dụ nóng để sử dụng các thông số bài đăng của tôi dưới dạng VaryByParam không? – lnetanel

+0

chắc chắn, <% @ OutputCache Duration = "600" VaryByParam = "YourPostParam1, YourPostParam2, (bất kỳ tham số GET nào), ..."%> – user134706

+0

Chỉ cần tìm ra điều này trước khi tìm bài đăng này - chúng tôi đã thực sự gặp sự cố một bản giới thiệu trực tiếp vì chúng tôi đã đặt VaryByParam thành "không" nơi các trang được đăng lại cho chính họ! –

2

Bạn là chính xác trong các giả định của bạn.

Chỉ thị OutputCache của bạn đang yêu cầu cơ chế lưu vào bộ đệm đầu ra lưu vào bộ nhớ cache toàn bộ trang hiển thị cho một URL cụ thể, trong 600 giây. Trong ví dụ đơn giản của bạn, có thể bạn không sử dụng bất kỳ chuỗi truy vấn nào, khai báo VaryByParam trong chỉ thị cho phép bạn chỉ định tham số chuỗi truy vấn để đảm bảo mỗi giá trị khác nhau của tham số đó được lưu trữ riêng biệt. Ví dụ, nếu bạn có:

<%@ OutputCache Duration="600" VaryByParam="ProductID"%> 

sau đó ba khác nhau URL sẽ từng được lưu trữ cá nhân, và thay đổi giá trị của "ProductID" tham số để một cái gì đó chưa được lưu trữ sẽ đảm bảo rằng trang được xử lý và hiển thị bởi các ASP.NET runtime một cách chính xác:

http://www.example.com/viewproduct.aspx?ProductID=123 
http://www.example.com/viewproduct.aspx?ProductID=3 
http://www.example.com/viewproduct.aspx?ProductID=67 

trong ví dụ của bạn, trên nút nhấp chuột, trang đã được trả trước (và cached) và khi bạn gửi lại một lần nữa không có sự khác biệt trong URL mà bạn đang đăng tải trở lại và tải lại hiệu quả, do đó, thời gian chạy ASP.NET sẽ hiển thị trang được lưu vào bộ nhớ cache cho bạn mà không cần thông qua e quá trình tái rendering nó.

Khác với việc thay đổi giá trị của tham số "VaryByParam", chỉ thị OutputCache khá là một chút về cách tiếp cận "tất cả hoặc không có gì" đối với bộ nhớ đệm trang. Tuy nhiên, có một thuộc tính "VaryByContol" để chỉ thị, chỉ có thể được sử dụng trong các điều khiển người dùng ASP.NET, thay vì một trang web ASP.NET hoàn chỉnh.

Từ câu hỏi của bạn, có vẻ như bạn cần điều tra một phần lưu vào bộ nhớ cache của trang. Hoặc đó là một cơ chế để làm mất hiệu lực bộ nhớ cache khi một số sự kiện xảy ra. Việc này thường được thực hiện bằng cách thêm "phụ thuộc bộ nhớ cache".

Cho rằng, các liên kết sau đây sẽ giúp:

Caching Portions of an ASP.NET Page
Tip/Trick: Implement "Donut Caching" with the ASP.NET 2.0 Output Cache Substitution Feature
Programmatically Removing a Page from the OutputCache

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