You need to enable JavaScript to run this app. Blazor WASM Hosted 已访问过Blazor的浏览器访问控制器路由被Blazor拦截报404
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.06 15:36:04