ปิดการใช้งานการแคชเบราว์เซอร์สำหรับเบราว์เซอร์ทั้งหมดจาก ASP.NET


87

ฉันได้รับการอ้างอิงที่ชัดเจนถึงรหัส ASP.NET ที่จำเป็นในการปิดใช้งานเบราว์เซอร์จากการแคชหน้า มีหลายวิธีในการส่งผลกระทบต่อส่วนหัว HTTP และเมตาแท็กและฉันได้รับการแสดงผลที่แตกต่างกันต้องตั้งค่าเพื่อให้เบราว์เซอร์ต่างๆทำงานได้อย่างถูกต้อง จะเป็นการดีมากที่จะได้รับโค้ดอ้างอิงที่แสดงความคิดเห็นเพื่อระบุว่าใช้งานได้กับเบราว์เซอร์ทั้งหมดและจำเป็นสำหรับเบราว์เซอร์ใดโดยเฉพาะรวมถึงเวอร์ชัน

มีข้อมูลจำนวนมากเกี่ยวกับปัญหานี้อยู่ที่นั่น แต่ฉันยังไม่พบข้อมูลอ้างอิงที่ดีที่อธิบายถึงประโยชน์ของแต่ละวิธีและว่าเทคนิคเฉพาะถูกแทนที่ด้วย API ระดับที่สูงกว่าหรือไม่

ฉันสนใจ ASP.NET 3.5 SP1 เป็นพิเศษ แต่มันก็เป็นการดีที่จะได้รับคำตอบสำหรับเวอร์ชันก่อนหน้านี้เช่นกัน

รายการบล็อกนี้ความแตกต่างที่สำคัญสองประการระหว่าง Firefox และ IE Cachingอธิบายถึงความแตกต่างของพฤติกรรมโปรโตคอล HTTP บางประการ

โค้ดตัวอย่างต่อไปนี้แสดงประเภทของสิ่งที่ฉันสนใจ

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
ฉันจะพยายามตอบถ้าฉันไม่รู้ว่างานของคุณเป็นไปไม่ได้ที่น่ากลัวขนาดไหน การควบคุมแคชของลูกค้าก็เหมือนกับการพยายามใช้ตะเกียบยาว 10 ฟุตเพื่อจัดเรียงเฟอร์นิเจอร์ใหม่
Jeff Meatball Yang

คำตอบมากมายที่ครอบคลุมเพียงส่วนหนึ่งของปัญหายังคงมีค่ามาก โปรดทุ่ม 2 เซ็นต์ของคุณให้คุ้มค่า
Martin Hollingsworth

คำตอบ:


98

นี่คือสิ่งที่เราใช้ใน ASP.NET:

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

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

หยุดการแคชใน Firefox และ IE แต่เรายังไม่ได้ลองใช้เบราว์เซอร์อื่น ส่วนหัวการตอบกลับต่อไปนี้ถูกเพิ่มโดยคำสั่งเหล่านี้:

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

5
+1 สิ่งนี้ใช้ได้ผลสำหรับฉันใน Chrome ขอบคุณมาก ฉันยังใช้ Response.Cache.SetAllowResponseInBrowserHistory (จริง); เพื่อหลีกเลี่ยงประวัติในการจัดเก็บรายการสำหรับแต่ละคำขอของหน้าเดียวกัน
daniloquio

12
เห็นได้ชัดว่ามีคนค้นพบว่าการใช้ SetCacheability กับ NoCache ยังปิดใช้งานแคชเอาต์พุต ASP.NET (แคชฝั่งเซิร์ฟเวอร์) พวกเขาแนะนำให้ใช้ตัวเลือก ServerAndNoCache แทน codeclimber.net.nz/archive/2007/04/01/…
md1337

1
SetCacheabilityเพื่อชี้แจงความคิดเห็นในข้อมูลโค้ดที่เป็นวิธีการหลัก SetNoStoreเป็นวิธีแก้ปัญหาของ IE6 ดูเหตุใดจึงควรใช้ทั้ง no-cache และ no-store ในการตอบสนอง HTTP .
Edward Brey

3
FWIW ... จำเป็นต้องเพิ่ม SetNoStore สำหรับ IE10
felickz

สำหรับผู้ที่อ่านหน้านี้ซึ่งจะแสดงไฟล์ PDF แบบไดนามิกผ่าน https และตั้งค่าส่วนหัวแคชเช่นนี้โปรดระวัง IE8 และข้อผิดพลาดต่อไปนี้: stackoverflow.com/questions/1038707/…
Paddy

41

สำหรับสิ่งที่คุ้มค่าฉันต้องจัดการสิ่งนี้ในแอปพลิเคชัน ASP.NET MVC 3 ของฉัน นี่คือบล็อกรหัสที่ฉันใช้ในไฟล์ Global.asax เพื่อจัดการสิ่งนี้สำหรับคำขอทั้งหมด

    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);
    }

HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)สร้างความแตกต่างเพื่อป้องกันไม่ให้แคชใน bith IE และ FireFox
ไมเคิล Kniskern

2
-1 การตั้งค่าใน Application_BeginRequest () เหล่านี้ทำให้ไม่มีการส่งส่วนหัวแคชสำหรับรายการที่คุณอาจต้องการแคช (ไฟล์ JavaScript รูปภาพ ฯลฯ ) ยังไม่ได้ลองใช้ แต่ตำแหน่งของ OP (ตั้งค่าส่วนหัวในหน้า ASP เอง) น่าจะดีกว่า
Evan Haas

ฉันคาดหวังว่าคำตอบนี้จะใช้งานได้เนื่องจากเป็นวิธีสุดท้ายที่จะตั้งค่าใน glabal.asax แต่ยังไม่มีความสุข
lawphotog

5
@Evan, Application_BeginRequest จะถูกเรียกสำหรับคำขอที่ส่งจาก IIS ไปยัง ASP.NET เท่านั้น หลายครั้งไฟล์คงที่เช่น CSS, JS, รูปภาพ, ฟอนต์ ฯลฯ เป็นส่วนขยายที่ถือว่าเป็นไฟล์แบบคงที่จาก IIS และไม่ถูกส่งไปยังรันไทม์ ASP.NET ถ้า IIS ถูกตั้งค่าให้ส่งคำขอทั้งหมดไปยังรันไทม์ ASP.NET ใช่แล้วสิ่งนี้จะใช้กับคำขอทั้งหมดแม้ว่าไฟล์จะเป็นแบบคงที่และควรถูกแคช
Adam Carr

@ อดัมเข้าท่า. ฉันจะยกเลิก -1 แต่ SO บอกว่าการโหวตของฉันถูกล็อค :-(
Evan Haas

2

ฉันได้ลองชุดค่าผสมต่างๆแล้วและล้มเหลวใน FireFox เป็นเวลานานแล้วดังนั้นคำตอบข้างต้นอาจใช้งานได้ดีหรือฉันอาจพลาดบางอย่างไป

สิ่งที่ได้ผลเสมอสำหรับฉันคือการเพิ่มสิ่งต่อไปนี้ในส่วนหัวของแต่ละหน้าหรือเทมเพลต (Master Page ใน. 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>

สิ่งนี้ได้ปิดใช้งานการแคชทั้งหมดในเบราว์เซอร์ทั้งหมดสำหรับฉันโดยไม่ล้มเหลว


7
ไม่แน่ใจว่าสิ่งนี้ควรทำอย่างไร แต่ดูเหมือนการแฮ็กไขมันขนาดใหญ่ที่จะล้มเหลวในการอัปเดตเบราว์เซอร์เหล่านี้ครั้งต่อไป
md1337

มีอธิบายไว้ที่เช่นweb.archive.org/web/20160112095216/http://www.hunlock.com/blogs/… - โดยสรุปเหตุการณ์ onbeforeunload ถูกนำไปใช้โดยธนาคารและป้องกันไม่ให้หน้าเว็บถูกแคช
ChrisW

1

มีสองวิธีที่ฉันรู้ อย่างแรกคือบอกเบราว์เซอร์ว่าอย่าแคชหน้า การตั้งค่าการตอบกลับเป็นไม่มีแคชจะดูแลอย่างไรก็ตามเนื่องจากคุณสงสัยว่าเบราว์เซอร์มักจะเพิกเฉยต่อคำสั่งนี้ อีกวิธีหนึ่งคือการกำหนดวันที่และเวลาในการตอบกลับของคุณเป็นประเด็นในอนาคต ฉันเชื่อว่าเบราว์เซอร์ทั้งหมดจะแก้ไขสิ่งนี้ให้เป็นเวลาปัจจุบันเมื่อพวกเขาเพิ่มหน้าลงในแคช แต่จะแสดงหน้านั้นใหม่กว่าเมื่อทำการเปรียบเทียบ ฉันเชื่อว่าอาจมีบางกรณีที่ไม่มีการเปรียบเทียบ ฉันไม่แน่ใจในรายละเอียดและมีการเปลี่ยนแปลงตามเบราว์เซอร์ใหม่แต่ละรุ่น หมายเหตุสุดท้ายฉันโชคดีกว่ากับหน้าที่ "รีเฟรช" ตัวเอง (คำสั่งการตอบกลับอื่น) ดูเหมือนว่าการรีเฟรชจะมาจากแคชน้อยลง

หวังว่าจะช่วยได้


0

ฉันจะทดสอบการเพิ่มแท็กไม่มีร้านค้าลงในไซต์ของเราเพื่อดูว่าสิ่งนี้สร้างความแตกต่างให้กับการแคชเบราว์เซอร์หรือไม่ (บางครั้ง Chrome ก็แคชหน้าเว็บ) ฉันพบว่าบทความนี้มีประโยชน์มากในเอกสารเกี่ยวกับวิธีการและเหตุผลที่การแคชทำงานและจะดู ETag ต่อไปหากไม่มีร้านค้าไม่น่าเชื่อถือ:

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

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


0

ดูวิธีป้องกันไม่ให้ Google Chrome แคชอินพุตของฉันโดยเฉพาะสิ่งที่ซ่อนอยู่เมื่อผู้ใช้คลิกย้อนกลับ? โดยที่ Chrome อาจโหลด แต่รักษาเนื้อหาก่อนหน้าของ<input>องค์ประกอบ - ในคำอื่น ๆ autocomplete="off"ที่ใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.