Blazor WASM Hosted 已访问过Blazor的浏览器访问控制器路由被Blazor拦截报404
问题核心根因
- 触发异常的本质是Blazor WASM Hosted 项目默认启用的 Service Worker(PWA缓存拦截机制)拦截了同域请求,和你配置的MVC控制器路由规则本身没有关系。
- 从未访问过Blazor应用的浏览器能正常工作,是因为当前域下没有注册激活Service Worker,所有对
/heat-maps/351的请求会直接透传到服务器,自然能匹配到对应的MVC控制器路由,返回服务器生成的正常页面。 - 访问过Blazor应用的浏览器会出现异常,是因为只要此前任意一次访问加载过Blazor应用,当前源下的Service Worker就会完成注册、激活。Service Worker是源级共享的运行时实例,会拦截同域下所有的导航请求,包括地址栏输入的新开标签页请求,直接返回预缓存的Blazor入口文件
index.html,根本不会把/heat-maps/351请求转发给服务器。后续加载的Blazor客户端路由没有匹配到对应页面规则,就会直接展示“页面未找到”的提示。
具体修复方案
调整Service Worker拦截规则
- 打开Client项目发布模式下的Service Worker配置文件
wwwroot/service-worker.published.js - 找到默认配置的
navigateFallback规则,这个规则的作用是把所有未命中静态资源缓存的导航请求,统一重定向到Blazor的index.html入口,是导致问题的核心逻辑 - 新增
navigateFallbackDenylist配置,把所有需要交由服务器端MVC处理的路由路径加入拦截排除名单,比如需要放行所有/heat-maps/开头的路由,配置示例为:navigateFallbackDenylist: [/^\/heat-maps\//] - 重新发布项目后,待浏览器自动更新到新版本的Service Worker,旧的拦截逻辑就会被覆盖,后续访问对应MVC路由时,Service Worker就不会拦截请求,会正常透传到服务器由控制器处理。
不需要PWA能力时直接禁用Service Worker
- 打开Client项目的
Program.cs,移除PWA相关服务注册代码:// 移除/注释这行代码 builder.Services.AddServiceWorkerAssetsManifest(); - 删除
wwwroot目录下的service-worker.js、service-worker.published.js文件,同时移除index.html中所有注册Service Worker的脚本逻辑 - 禁用后所有同域请求都会直接透传到服务器,由服务器端的路由规则(MVC控制器、Blazor静态资源托管逻辑)逐一匹配处理,不会再出现前端拦截请求的问题。
快速验证排查方式
- 如果你需要快速验证根因,可以在之前访问过Blazor的浏览器站点设置中,手动清除当前域的站点数据、移除已注册的Service Worker,之后重新访问
/heat-maps/351地址。如果能正常返回MVC生成的页面,就可以100%确认异常来源于Service Worker的请求拦截。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

