.NET 8 Blazor Web App中UseStatusCodePagesWithReExecute失效及NotFound疑问
解决方案
1. 让UseStatusCodePagesWithReExecute正常工作(解决防伪造错误)
问题核心是内部重定向到/404时,Blazor的防伪造中间件会验证请求令牌,但内部重定向请求不会携带该令牌,导致验证失败。按以下步骤修复:
步骤1:调整中间件顺序
确保UseStatusCodePagesWithReExecute的位置在UseStaticFiles之后,UseAntiforgery和MapRazorComponents之前,正确的Program.cs配置示例:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); // 状态码页面中间件放在静态文件之后,路由组件之前 app.UseStatusCodePagesWithReExecute("/404"); app.UseAntiforgery(); app.MapRazorComponents<App>() .AddInteractiveServerRenderMode(); app.Run();
步骤2:排除/404路径的防伪造检查
在UseAntiforgery配置中添加排除路径,跳过对/404的令牌验证:
app.UseAntiforgery(options => { options.ExcludePaths.Add("/404"); });
步骤3:确保404.razor组件配置正确
在组件顶部添加路由指令,若不需要交互式渲染(静态预渲染即可),无需添加交互式渲染模式:
@page "/404" <h1>404 - 页面未找到</h1> <p>您访问的页面不存在,请检查URL是否正确。</p>
如果需要交互式功能,可添加@rendermode InteractiveServer,但需确保防伪造排除配置生效。
2. Router中NotFound内容的显示时机
Router的NotFound内容仅在以下场景触发:
- 请求被Blazor路由系统接管:即请求不是静态文件、API端点等由其他中间件处理的资源,而是Blazor路由能识别的路径(如
/invalid-page)。 - 无匹配路由组件:Blazor路由遍历所有注册的路由后,找不到对应组件。
- 未触发状态码中间件:默认情况下,Blazor Router在找不到路由时会返回
200 OK状态码,而非404,因此UseStatusCodePagesWithReExecute这类状态码中间件不会被触发,此时会直接渲染NotFound内容。
你观察到的「将状态码中间件置于UseStaticFiles之前时显示NotFound」的现象,原因是:
- 访问不存在的Blazor路由时,Router先处理请求并返回
200,状态码中间件因先于静态文件中间件,无法捕获到404,因此直接显示Router的NotFound内容。 - 访问不存在的静态文件时,静态文件中间件返回
404,会被状态码中间件捕获并重定向到/404。
另外,若要让Router返回404状态码并渲染自定义页面,必须依赖UseStatusCodePagesWithReExecute这类中间件,因为Blazor组件无法直接设置HTTP响应状态码。
内容的提问来源于stack exchange,提问作者Donny Kwitty
相关产品推荐
相关产品推荐

