Tắt bộ nhớ đệm của trình duyệt cho tất cả các trình duyệt từ ASP.NET


87

Tôi đang tham khảo cuối cùng về mã ASP.NET được yêu cầu để tắt các trình duyệt khỏi bộ nhớ đệm của trang. Có nhiều cách để ảnh hưởng đến tiêu đề HTTP và thẻ meta và tôi nhận thấy rằng các cài đặt khác nhau được yêu cầu để các trình duyệt khác nhau hoạt động chính xác. Sẽ thực sự tuyệt vời nếu nhận được một đoạn mã tham chiếu được nhận xét để chỉ ra cái nào hoạt động cho tất cả các trình duyệt và cái nào là bắt buộc đối với trình duyệt cụ thể, bao gồm cả các phiên bản.

Có một lượng lớn thông tin về vấn đề này ở đó nhưng tôi vẫn chưa tìm thấy tài liệu tham khảo tốt mô tả lợi ích của từng phương pháp và liệu một kỹ thuật cụ thể có được thay thế bằng API cấp cao hơn hay không.

Tôi đặc biệt quan tâm đến ASP.NET 3.5 SP1 nhưng sẽ rất tốt nếu bạn nhận được câu trả lời cho phiên bản trước đó.

Mục blog này Hai điểm khác biệt quan trọng giữa Firefox và IE Caching mô tả một số khác biệt về hành vi giao thức HTTP.

Đoạn mã mẫu sau đây minh họa loại điều tôi quan tâm

public abstract class NoCacheBasePage : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        DisableClientCaching();
    }

    private void DisableClientCaching()
    {
        // Do any of these result in META tags e.g. <META HTTP-EQUIV="Expire" CONTENT="-1">
        // HTTP Headers or both?

        // Does this only work for IE?
        Response.Cache.SetCacheability(HttpCacheability.NoCache);

        // Is this required for FireFox? Would be good to do this without magic strings.
        // Won't it overwrite the previous setting
        Response.Headers.Add("Cache-Control", "no-cache, no-store");

        // Why is it necessary to explicitly call SetExpires. Presume it is still better than calling
        // Response.Headers.Add( directly
        Response.Cache.SetExpires(DateTime.UtcNow.AddYears(-1));
    }
}

5
Tôi sẽ cố gắng trả lời nếu tôi không biết nhiệm vụ của bạn là bất khả thi khủng khiếp như thế nào. Kiểm soát bộ nhớ đệm của khách hàng giống như cố gắng sử dụng đôi đũa dài 10 feet để sắp xếp lại đồ đạc.
Jeff Meatball Yang

Rất nhiều câu trả lời chỉ bao gồm một phần của vấn đề sẽ vẫn rất có giá trị. Vui lòng ném vào 2 xu giá trị của bạn.
Martin Hollingsworth

Câu trả lời:


96

Đây là những gì chúng tôi sử dụng trong ASP.NET:

// Stop Caching in IE
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

// Stop Caching in Firefox
Response.Cache.SetNoStore();

Nó dừng lưu trữ trong Firefox và IE, nhưng chúng tôi chưa thử các trình duyệt khác. Các tiêu đề phản hồi sau được thêm vào bởi các câu lệnh này:

Cache-Control: no-cache, no-store
Pragma: no-cache

5
+1 Điều này đang hoạt động đối với tôi trong Chrome, cảm ơn rất nhiều. Tôi cũng sử dụng Response.Cache.SetAllowResponseInBrowserHistory (true); để tránh lịch sử lưu trữ một mục nhập cho mỗi yêu cầu của cùng một trang.
daniloquio

12
Rõ ràng ai đó đã phát hiện ra rằng việc sử dụng SetCacheability với NoCache cũng vô hiệu hóa bộ đệm đầu ra ASP.NET (bộ đệm phía máy chủ). Họ đề xuất sử dụng tùy chọn ServerAndNoCache để thay thế. codeclimber.net.nz/archive/2007/04/01/…
md1337 Ngày

1
Để làm rõ các nhận xét trong đoạn mã, phương pháp chính là SetCacheability. SetNoStorelà một giải pháp thay thế cho IE6. Xem Tại sao nên sử dụng cả no-cache và no-store trong phản hồi HTTP? .
Edward Brey

3
FWIW ... Cần thêm SetNoStore cho IE10
felickz

Đối với những người đọc trang này ai sẽ xuất ra file PDF động trên https và thiết lập các tiêu đề bộ nhớ cache như thế này, xin hãy cẩn thận các IE8 và lỗi thấp sau: stackoverflow.com/questions/1038707/...
Paddy

41

Đối với những gì nó đáng giá, tôi chỉ phải xử lý điều này trong ứng dụng ASP.NET MVC 3 của mình. Đây là khối mã tôi đã sử dụng trong tệp Global.asax để xử lý điều này cho tất cả các yêu cầu.

    protected void Application_BeginRequest()
    {
        //NOTE: Stopping IE from being a caching whore
        HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false);
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Cache.SetNoStore();
        Response.Cache.SetExpires(DateTime.Now);
        Response.Cache.SetValidUntilExpires(true);
    }

Sự HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)khác biệt đã tạo ra sự khác biệt để ngăn chặn bộ nhớ đệm trong bith IE và FireFox
Michael Kniskern

2
-1, cài đặt trong Application_BeginRequest () này khiến tiêu đề no-cache được gửi cho các mục mà bạn có thể muốn lưu trong bộ nhớ cache (tệp JavaScript, hình ảnh, v.v.). Tôi chưa thử, nhưng vị trí của OP (đặt tiêu đề trong chính trang ASP) có lẽ tốt hơn.
Evan Haas

Tôi đã mong đợi câu trả lời này hoạt động vì đây là cách gọn gàng nhất để đặt nó trong glabal.asax nhưng chưa có gì vui
lawphotog

5
@Evan, Application_BeginRequest sẽ chỉ được gọi cho các yêu cầu được gửi từ IIS tới ASP.NET. Nhiều khi, các tệp tĩnh như CSS, JS, Hình ảnh, Phông chữ, v.v. là các phần mở rộng được coi là tệp tĩnh từ IIS và không được gửi đến ASP.NET Runtime. Nếu IIS được thiết lập để gửi tất cả các yêu cầu đến thời gian chạy ASP.NET thì có, điều này sẽ áp dụng cho tất cả các yêu cầu, ngay cả khi các tệp là tĩnh và nên được lưu vào bộ nhớ đệm.
Adam Carr

@Adam, có lý. Tôi sẽ hoàn tác -1 của mình nhưng SO nói rằng phiếu bầu của tôi đã bị khóa :-(
Evan Haas

2

Tôi đã thử nhiều cách kết hợp khác nhau và chúng không thành công trong FireFox. Đã lâu rồi nên câu trả lời ở trên có thể hoạt động tốt hoặc tôi có thể đã bỏ lỡ điều gì đó.

Điều luôn làm việc với tôi là thêm phần sau vào đầu mỗi trang, hoặc mẫu (Trang chính trong .net).

<script language="javascript" type="text/javascript">
    window.onbeforeunload = function () {   
        // This function does nothing.  It won't spawn a confirmation dialog   
        // But it will ensure that the page is not cached by the browser.
    }  
</script>

Điều này đã vô hiệu hóa tất cả bộ nhớ đệm trong tất cả các trình duyệt cho tôi mà không bị lỗi.


7
Không chắc điều này sẽ làm gì, nhưng nó trông giống như một vụ hack lớn nhất định sẽ thất bại trong bản cập nhật tiếp theo của bất kỳ trình duyệt nào trong số này.
md1337 Ngày

Nó được giải thích tại ví dụ: web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/… - tóm lại sự kiện onbeforeunload đã được triển khai để các ngân hàng sử dụng và ngăn trang được lưu vào bộ nhớ cache.
ChrisW

1

Có hai cách tiếp cận mà tôi biết. Đầu tiên là yêu cầu trình duyệt không lưu trang vào bộ nhớ cache. Việc đặt Phản hồi thành không có bộ nhớ cache sẽ giải quyết vấn đề đó, tuy nhiên khi bạn nghi ngờ, trình duyệt sẽ thường bỏ qua chỉ thị này. Cách tiếp cận khác là đặt thời gian phản hồi của bạn thành một thời điểm trong tương lai. Tôi tin rằng tất cả các trình duyệt sẽ sửa lỗi này thành thời điểm hiện tại khi họ thêm trang vào bộ nhớ cache, nhưng nó sẽ hiển thị trang mới hơn khi so sánh được thực hiện. Tôi tin rằng có thể có một số trường hợp không so sánh được. Tôi không chắc về các chi tiết và chúng thay đổi theo từng bản phát hành trình duyệt mới. Lưu ý cuối cùng, tôi đã gặp may mắn hơn với các trang tự "làm mới" (một chỉ thị phản hồi khác). Việc làm mới dường như ít đến từ bộ nhớ cache.

Hy vọng rằng sẽ giúp.


0

Tôi sẽ thử nghiệm thêm thẻ no-store vào trang web của chúng tôi để xem liệu điều này có tạo ra sự khác biệt cho bộ nhớ đệm của trình duyệt hay không (Chrome đôi khi đã lưu vào bộ nhớ đệm các trang). Tôi cũng thấy bài viết này rất hữu ích về tài liệu về cách thức và lý do tại sao bộ nhớ đệm hoạt động và sẽ xem xét phần tiếp theo của ETag nếu no-store không đáng tin cậy:

http://www.mnot.net/cache_docs/

http://en.wikipedia.org/wiki/HTTP_ETag


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.