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

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页面实现:

  1. 创建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 => "服务器内部错误",
            _ => "未知错误"
        };
    }
}
  1. 在Program.cs中配置全局错误处理:
app.UseExceptionHandler("/Error");
app.UseStatusCodePagesWithReExecute("/Error", "?statusCode={0}");

内容的提问来源于stack exchange,提问作者KhataPlus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:35:13