You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:07:33