【C#】MVC 對特定的靜態檔案設定快取標頭

發現全域的Cache-Control 設定會導致Action 沒有被正確觸發,而改用後端方式偵測來自Brower 的Request 資源副檔名,並加以為各別檔案設定快取。

在專案上遇到一個問題:在/Account/Login 的Action 寫了一些檢核的程式碼,發現並不是每次都會觸發到Action,就會因為檢核失敗導致錯誤發生。

發現錯誤的原因是Web.config 裡面,設定的全域的Cache-Control。所以有時候進到畫面,是從使用者電腦的disk cache 或memory cache 取得資源來渲染畫面。而無法觸發Action。
 

設定Cache 有蠻多種方式:

  1. Web.Config
  2. 各別Controller、Action 以屬性方式設定
  3. 檢查Request Header 並加工Header

本次使用的是第三種方式,因為有一些需要客製化的部分,用程式比較好達成目的。也參考了ChatGPT 蒐集到的資料。

所以在Global.asax.cs 中,將事件加入PreSendRequestHeaders

配合系統更新時間,設定每天19:00 為指定副檔名的靜態檔案資源到期時間。

References:
Response caching in ASP.NET Core | Microsoft Learn
Cache-Control - HTTP | MDN (mozilla.org)
Website Performance with ASP.NET - Part4 - Use Cache Headers - CodeProject