Blazor InteractiveServer自定义错误页防伪造中间件异常问题
Blazor InteractiveServer 自定义错误页问题解决
错误原因解释
你遇到的防伪造中间件是Blazor Server端的电路保护防伪造中间件,它是InteractiveServer模式下保障组件交互安全的核心组件,通常由MapBlazorHub()自动引入。问题出在错误页端点的配置未与Blazor路由系统正确整合,导致防伪造元数据被标记但中间件未生效。
修复当前防伪造问题的步骤
1. 确保Program.cs中间件配置顺序正确
Blazor相关中间件的加载顺序至关重要,必须严格遵循以下顺序:
var builder = WebApplication.CreateBuilder(args); // 注册Blazor Server服务(包含防伪造相关依赖) builder.Services.AddServerSideBlazor(); var app = builder.Build(); // 静态文件中间件 app.UseStaticFiles(); // 路由中间件(必须在Blazor Hub之前) app.UseRouting(); // 添加Blazor Hub,自动引入防伪造中间件 app.MapBlazorHub(); // 映射Blazor根组件 app.MapFallbackToPage("/_Host"); app.Run();
2. 通过Blazor路由系统配置错误页
推荐在App.razor中整合错误路由,而非直接通过app.Map绑定端点:
<Router AppAssembly="@typeof(App).Assembly"> <Found Context="routeData"> <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /> <FocusOnNavigate RouteData="@routeData" Selector="h1" /> </Found> <NotFound> <!-- 处理404错误 --> <LayoutView Layout="@typeof(MainLayout)"> <ErrorPg ErCode="404" /> </LayoutView> </NotFound> </Router>
3. 处理非404状态码
通过ASP.NET Core状态码中间件将错误请求重定向到Blazor错误组件:
在Program.cs中添加(放在UseRouting之后,MapBlazorHub之前):
app.UseStatusCodePagesWithReExecute("/error/{0}");
然后在ErrorPg.razor中添加路由参数接收状态码:
@page "/error/{ErCode:int}" <h1>错误 @ErCode</h1> <p>抱歉,请求出现错误,请稍后重试。</p> @code { [Parameter] public int ErCode { get; set; } }
其他自定义错误页实现方式
如果不需要Blazor组件的交互能力,也可以使用ASP.NET Core原生静态Razor页面实现:
- 创建
Pages/Error.cshtml页面:
@page @model ErrorModel <h1>错误 @Model.StatusCode</h1> <p>@Model.ErrorMessage</p> @code { [BindProperty(SupportsGet = true)] public int StatusCode { get; set; } public string ErrorMessage { get; set; } public void OnGet() { ErrorMessage = StatusCode switch { 400 => "请求参数无效,请检查后重试", 404 => "访问的页面不存在", 500 => "服务器内部错误", _ => "未知错误" }; } }
- 在Program.cs中配置全局错误处理:
app.UseExceptionHandler("/Error"); app.UseStatusCodePagesWithReExecute("/Error", "?statusCode={0}");
内容的提问来源于stack exchange,提问作者KhataPlus
相关产品推荐
相关产品推荐

