2012-05-14 27 views
7

tôi có sản lượng bộ nhớ đệm cho phép trong một trong những trang như sau:Vô hiệu hóa Output cache nếu có một ngoại lệ trên trang

<%@ OutputCache Duration="300" VaryByParam="*"%> 

Vấn đề là đôi khi có một ngoại lệ và chúng tôi hiển thị thông báo thích hợp. Nhưng trang này sau đó được lưu trong bộ nhớ cache và những người dùng khác cũng nhìn thấy thông báo ngoại lệ. Ví dụ, giả sử cơ sở dữ liệu hết thời gian và do đó một ngoại lệ Sql được ném ra. Ngoại lệ này bị bắt và thông báo được hiển thị "Lỗi khi kết nối với cơ sở dữ liệu. Vui lòng thử lại sau một thời gian". Bây giờ thư này được lưu trữ và hiển thị cho người dùng khác mà không cần truy vấn cơ sở dữ liệu.

Vì vậy, những gì tôi muốn làm là làm mất hiệu lực bộ nhớ cache đầu ra cụ thể nếu có một ngoại lệ, hoặc có lẽ không phải bộ nhớ cache khi có một ngoại lệ. Điều này có thể giải quyết như thế nào?

Đây là dành cho ASP.NET 3.5 Webforms.

Trả lời

5

Bạn sẽ có thể để loại bỏ các mục cache

HttpResponse.RemoveOutputCacheItem("/MyPage/MyParameter"); 
+1

+1 nhưng đâu là nơi tốt nhất để kích hoạt cho tất cả các ngoại lệ? Trong xử lý ngoại lệ của đối tượng ứng dụng, hoặc một nơi nào đó trên trang, hoặc cuối cùng trên phương thức điều khiển (nếu nó là MVC, và nếu đó không phải là quá sớm?) Hoặc ở một nơi khác? – Rup

2

Giả sử trường hợp ngoại lệ của bạn đến để Application_Error trong Global.asax, bạn có thể thử như sau:

public void Application_Error(Object sender, EventArgs e) { 
    ... 

    Response.Cache.AddValidationCallback(
     DontCacheCurrentResponse, 
     null); 

    ... 
} 

private void DontCacheCurrentResponse(
    HttpContext context, 
    Object data, 
    ref HttpValidationStatus status) { 

    status = HttpValidationStatus.IgnoreThisRequest; 
} 

Điều này sẽ đảm bảo rằng các tiếp theo phản hồi sẽ không được phục vụ từ bộ nhớ cache nhưng thực sự sẽ đưa nó vào trang/bộ điều khiển của bạn.

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