2012-04-16 17 views
6

Chúng tôi đang chạy một trang web khá lớn xây dựng với ASP.NET MVC 3 và AppFabric như một giải pháp bộ đệm phân phối. Chúng tôi đã triển khai một tệp OutputCacheAdapter tùy chỉnh để sử dụng cụm AppFabric của chúng tôi.ASP.NET MVC hits outputcache cho mỗi hành động

Chúng tôi thấy rằng ASP.NET gọi phương thức OutputCacheProvider.Get() cho mọi hành động, ngay cả khi hành động đó KHÔNG được trang trí bằng @OutputCacheAttribute.

Đó không phải là một vấn đề nếu bạn sử dụng defaultcacheprovider mặc định nhưng đó là khi bạn đang chạy một outputcacheprovider cư trú trên các máy riêng biệt.

Trả lời

4

Theo thiết kế, bộ đệm đầu ra được kiểm tra trước tiên để có bản sao trang được lưu trong bộ nhớ cache. Nếu có một bản sao được lưu trong bộ nhớ cache, nó sẽ được trả lại và không có gì thêm được thực hiện. Đặc biệt, không có bộ điều khiển và không có hành động điều khiển nào được bắt nguồn, được kiểm tra hoặc thực thi. Điều này xảy ra chỉ khi trang không được lưu trong bộ nhớ cache.

Bạn cần phải thay đổi nhà cung cấp bộ nhớ cache để có thể nhanh chóng xác định xem một trang có khả năng được lưu vào bộ nhớ cache hay không. Chỉ khi đó là một trang có thể lưu trữ, thì nó sẽ đi và kiểm tra bộ nhớ cache được phân phối. Séc này không thể dựa trên số OutputCacheAttribute vì chúng không có sẵn trong quá trình xử lý yêu cầu này. Thay vào đó, việc kiểm tra nhanh phải được thực hiện bằng URL, cookie và thông tin tiêu đề HTML khác.

+0

Có vẻ như đó là một lời giải thích tốt. Không thể thực sự làm được gì nhiều với nó mặc dù, hoặc chấp nhận hình phạt hiệu suất, quay trở lại mặc định OutputCacheProvider hoặc cung cấp một cái gì đó giống như một danh sách đen hoặc trắng cho URLS. – TheNameless

+1

@TheNameless Tôi đã không tự mình làm nhưng không thể lấy thông số tuyến đường [bằng cách nào đó] (http://www.scottschluer.com/creating-a-routedata-instance-from-a-url/) và sau đó sử dụng sự phản chiếu để kiểm tra các thuộc tính trên bộ điều khiển/hành động? Nó không phải là lý tưởng nhưng có lẽ vẫn còn nhanh hơn một chuyến đi vòng quanh mạng. – Basic

0

Bạn có thể sử dụng thuộc tính outputcache Donut Cache cho phép bạn xác định tiền tố cho các khóa bộ nhớ cache đầu ra. Vì vậy, trong nhà cung cấp tùy chỉnh của bạn chỉ nhận/thiết lập bộ nhớ cache nếu khóa bộ nhớ cache bắt đầu bằng tiền tố của riêng bạn.