在升級 ASP.NET Core Blazor 應用程式時避免 HTTP 快取問題
注意
這不是這篇文章的最新版本。 如需目前版本,請參閱本文的 .NET 8 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支援原則。 如需目前版本,請參閱本文的 .NET 8 版本。
Blazor 應用程式不正確地升級或設定時,可能導致現有使用者無法順暢升級。 本文討論在跨主要版本升級 Blazor 應用程式時可能發生的一些常見 HTTP 快取問題。 此外也提供一些建議動作,以確保使用者能夠順暢地轉換。
雖然未來的 Blazor 版本可能提供更好的解決方案來處理 HTTP 快取問題,但最終仍須仰賴應用程式正確設定快取。 適當的快取設定可確保應用程式的使用者一律有最新的應用程式版本,不僅能改善體驗,還可降低發生錯誤的可能性。
對使用者升級體驗造成負面影響的常見問題包括:
- 專案和套件更新處理不正確:如果您未將應用程式已部署的所有專案更新為使用相同的主要架構版本,或是您在有較新的版本時,在主要升級的過程中使用了舊版套件,就會發生這種情況。
- 快取標頭的設定不正確:HTTP 快取標頭會控制快取應用程式回應的方式、位置及時間長度。 若未正確設定標頭,使用者可能會收到過時的內容。
- 其他層的設定不正確:內容傳遞網路 (CDN) 和已部署應用程式的其他層若未正確設定,可能會導致問題。 例如,CDN 的設計目的是快取和傳遞內容,以改善效能並減少延遲。 如果 CDN 未正確提供資產的快取版本,可能導致過時的內容傳遞給使用者。
偵測和診斷升級問題
升級問題的具體表現通常是無法在瀏覽器中啟動應用程式。 一般來說,警告表示有過時的資產存在,或是有遺失或與應用程式不一致的資產。
- 首先,檢查應用程式是否在全新的瀏覽器執行個體中成功載入。 使用私人瀏覽器模式載入應用程式,例如 Microsoft Edge InPrivate 模式或 Google Chrome 無痕模式。 如果應用程式無法載入,可能表示有一或多個套件或架構未正確更新。
- 如果應用程式在全新的瀏覽器執行個體中正確載入,則有可能是從過時的快取為應用程式提供服務的。 在大部分情況下,使用 Ctrl+F5 強制瀏覽器重新整理會排清快取,讓應用程式使用最新的資產載入及執行。
- 如果應用程式繼續失敗,有可能是過時的 CDN 快取正在為應用程式提供服務。 嘗試透過 CDN 提供者提供的任何機制來排清 DNS 快取。
升級前的建議動作
先前為應用程式提供服務的程序,可能導致更新程序更為棘手。 例如,過去避免或不正確地使用快取標頭,可能導致使用者現在遇到快取問題。 您可以利用以下幾節中的動作來減輕問題,並改善使用者的升級程序。
使架構套件與架構版本保持一致
確定架構套件與架構版本相符。 有較新版本可用時,使用舊版套件可能導致相容性問題。 請務必確定應用程式所有已部署的專案,都使用相同的主要架構版本。 這種一致性有助於避免非預期的行為和錯誤。
確認有正確的快取標頭
資源要求的回應中應有正確的快取標頭。 這包括 ETag
、Cache-Control
和其他快取標頭。 這些標頭的設定取決於裝載服務或裝載伺服器平台。 這對於 Blazor 指令碼 (blazor.webassembly.js
) 之類的資產和該指令碼下載的任何項目而言尤其重要。
不正確的 HTTP 快取標頭也可能會影響到服務背景工作角色。 服務背景工作角色仰賴快取標頭有效管理快取的資源。 因此,標頭不正確的或遺漏可能中斷服務背景工作角色的功能。
使用 Clear-Site-Data
刪除瀏覽器中的狀態
請考慮使用 Clear-Site-Data
標頭來刪除瀏覽器中的狀態。
快取狀態問題的來源通常僅限於 HTTP 瀏覽器快取,因此使用 cache
指示詞應該就夠了。 此動作有助於確保瀏覽器會從伺服器擷取最新的資源,而不是從快取提供過時的內容。
您可以選擇加入 storage
指示詞,在清除 HTTP 瀏覽器快取的同時清除本機儲存體快取。 不過,如果使用 storage
指示詞,使用用戶端儲存體的應用程式可能會遺失重要資訊。
將查詢字串附加至 Blazor 指令碼標籤
如果先前的建議動作都無效、都無法用於您的部署,或是不適用於您的應用程式,請考慮暫時將查詢字串附加至 Blazor 指令碼的 <script>
標籤來源。 在大部分情況下,此動作應足以強制瀏覽器略過本機 HTTP 快取,並且下載新版本的應用程式。 無須在應用程式中讀取或使用查詢字串。
在下列範例中,查詢字串 temporaryQueryString=1
會暫時套用至 <script>
標籤的相對外部來源 URI:
<script src="_framework/blazor.webassembly.js?temporaryQueryString=1"></script>
在應用程式的所有使用者都重新載入應用程式之後,就可以移除查詢字串。
或者,您可以使用相關的版本設定來套用持續性查詢字串。 下列範例假設應用程式的版本符合 .NET 發行版本 (.NET 8 為 8
):
<script src="_framework/blazor.webassembly.js?version=8"></script>
如需 Blazor 指令碼 <script>
標籤的位置,請參閱 ASP.NET Core Blazor 專案結構。