2010-01-18 39 views
5

Tôi đã nhận thấy rằng khi tôi Response.Redirect đến một trang .aspx, nó đôi khi hiển thị trang được lưu trong bộ nhớ cache thay vì thực sự thực thi trang và lấy dữ liệu mới từ cơ sở dữ liệu.Tại sao Response.Redirect đôi khi kéo từ bộ nhớ cache?

Tôi không sử dụng bộ nhớ đệm đầu ra hoặc bất kỳ điều gì đặc biệt trong .Net đây - đây là CRM và bộ nhớ đệm đang diễn ra trên máy khách hoặc có khả năng tự động trong IIS.

Không bao giờ có một chuỗi truy vấn liên quan. Tôi đang đi qua một khóa thông qua phiên. Tôi biết rằng nếu tôi sử dụng chuỗi truy vấn, nó có thể sẽ bỏ qua một phần vấn đề bộ nhớ cache, nhưng nó không phải là một lựa chọn trong trường hợp này, và dù sao tôi thực sự muốn hiểu sâu hơn về những gì đang diễn ra.

Tôi đã thực hiện một chút, và một số người có được điều này bằng cách sử dụng Server.Transfer (thực sự hoạt động khác với Response.Redirect và một số chi tiết không phải lúc nào cũng mong muốn), và một số người khác đã nói để đặt Phản hồi. Cache.SetCacheability (HttpCacheability.NoCache) trên trang mà tôi muốn tránh bộ nhớ đệm.

Tôi muốn hiểu rõ hơn về những gì đang xảy ra ở đây, và có thể là một cách thực hành tốt nhất - vì một điều, tôi nghĩ các trang .aspx luôn được gắn cờ để tránh lưu vào bộ nhớ đệm. Đúng?

Mọi suy nghĩ?

Trả lời

6

Theo mặc định, không có tiêu đề nào được thiết kế để kiểm soát bộ đệm ẩn được gửi. Điều này khiến khách hàng phải tạo ra các quy tắc riêng của mình về cách cache nội dung được gửi đi.

Vì vậy, có bạn sẽ cần một cái gì đó như: -

Response.Cache.SetCacheability(HttpCacheability.NoCache) 

để đảm bảo rằng một yêu cầu (redirect hay cách khác) không chỉ đơn giản là sử dụng một phiên bản cache.

+0

@Brian: Tôi sẽ làm thế nào nếu tôi xử lý các nhấp chuột vào nút phía máy chủ. – AnthonyWJones

+0

+1: lưu ý nhanh: tôi đã thêm điều này trước khi response.redirect và không làm gì, tôi phải thêm trang này vào page_load của trang tôi không được lưu vào bộ nhớ cache, điều này có ý nghĩa gì? – lurscher

5

Response.Redirect gửi phản hồi tới trình duyệt cho biết đối tượng được yêu cầu đã di chuyển và cung cấp cho đối tượng địa điểm mới. Trong trường hợp này, nếu bạn chuyển hướng đến "redirect.aspx", nếu trình duyệt có mục đó trong bộ nhớ cache, trình duyệt sẽ hiển thị nó từ đó với điều kiện các tiêu chí về khả năng lưu trữ được đáp ứng.

Bạn đề cập đến Response.Transfer, nhưng bạn có nghĩa là Server.Transfer. Đó là một cơ chế phía máy chủ để chuyển ngữ cảnh thực hiện sang một trang mới. Vì vậy, người dùng yêu cầu "main.aspx" trong ứng dụng của bạn. Trong trang đó, bạn Server.Transfer để "transfer.aspx". Về phía máy chủ, nó là cùng một yêu cầu, vì vậy khi đầu ra được hiển thị, trình duyệt của khách hàng sẽ hiển thị một URL của "main.aspx", không phải là "transfer.aspx".

Để tóm tắt - Chuyển hướng = 2 yêu cầu, Chuyển = 1 yêu cầu. Hy vọng rằng sẽ giúp.

Và có, bạn cần đặt khả năng lưu vào bộ nhớ cache nếu bạn muốn các trang luôn thực hiện cuộc gọi đến máy chủ. Theo mặc định, aspx không có hành vi trình duyệt đặc biệt, vì nó chỉ gửi html. Bạn có thể đặt:

Trả lời.Expires = -1 chẳng hạn.

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