注释
此版本不是本文的最新版本。 要查看当前版本,请参阅本文的.NET 9 版本。
警告
此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 要查看当前版本,请参阅本文的.NET 9 版本。
本文介绍如何在升级 Blazor 应用时避免 HTTP 缓存问题。
如果 Blazor 应用未正确升级或配置,则可能会导致现有用户进行非无缝升级。 本文讨论了跨主要版本升级 Blazor 应用时可能发生的一些常见 HTTP 缓存问题。 它还提供了一些建议的措施,以确保你的用户能够顺利过渡。
虽然将来 Blazor 的版本可能会提供更好的解决方案来处理 HTTP 缓存问题,但最终由应用正确配置缓存。 适当的缓存设置可确保应用程序的用户始终拥有该应用程序的最新版本,从而增强用户体验并降低发生错误的概率。
对用户升级体验产生负面影响的常见问题包括:
- 项目和包更新的处理不正确:如果不更新应用的所有已部署项目以使用同一主框架版本,或者在较新版本作为主要升级的一部分提供时使用早期版本中的包,则会发生此情况。
- 缓存标头的配置不正确:HTTP 缓存标头控制缓存应用的响应的缓存方式、位置和时长。 如果未正确配置标头,则用户可能会收到过时或不匹配的文件。 这包括 Blazor 捆绑资产缓存,其中必须正确设置服务器缓存标头以避免客户端上的缓存问题。
- 其他层的配置不正确:内容分发网络(CDN)和已部署应用的其他层在配置不当时可能会导致问题。 例如,CDN 旨在缓存和传送内容以提高性能并减少延迟。 如果 CDN 未正确提供缓存的资产版本,则可能会导致将过时的内容传送给用户。
检测和诊断升级问题
升级问题通常显示为无法在浏览器中启动应用。 通常,警告表示存在陈旧资产,或资产缺失,与应用不一致。
- 首先,检查应用是否在干净浏览器实例中成功加载。 使用专用浏览器模式加载应用,例如Microsoft Edge InPrivate 模式或 Google Chrome Incognito 模式。 如果应用无法加载,则可能意味着一个或多个包或框架未正确更新。
- 如果应用在干净浏览器实例中正确加载,则可能是从过时的缓存中提供该应用。 在大多数情况下,使用 Ctrl+F5 进行硬浏览器刷新会刷新缓存,从而允许应用使用最新资产加载和运行。
- 如果应用继续失败,则可能是过时的 CDN 缓存正在为应用提供服务。 尝试通过 CDN 提供程序提供的任何机制刷新 DNS 缓存。
在升级之前的建议操作
为应用提供服务的先前过程可能会使更新过程更具挑战性。 例如,避免或错误地使用过去缓存标头可能会导致用户的当前缓存问题。 可以采取以下部分中的作来缓解问题并改进用户的升级过程。
使框架包与框架版本保持一致
确保框架包与框架版本一致。 当较新版本可用时,使用早期版本中的包可能会导致兼容性问题。 此外,请务必确保所有应用的已部署项目都使用相同的主框架版本。 这种一致性有助于避免意外的行为和错误。
验证是否存在正确的缓存标头
对资源请求的响应中应存在正确的缓存标头。 这包括 ETag、Cache-Control和其他缓存标头。 这些标头的配置依赖于托管服务或托管服务器平台。 对于例如Blazor脚本这样的资产及脚本下载的任何内容,它们尤其重要。
不正确的 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 版本匹配(8 对于 .NET 8):
<script src="_framework/blazor.webassembly.js?version=8"></script>
有关