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

.NET 6 Blazor Server缺失端点如何返回真实404 HTTP状态码

解决Blazor Server与REST API的404状态码问题

一、核心思路:按请求类型拆分处理

通过中间件区分API和Blazor页面请求,分别返回符合规范的404响应:

1. REST API的404处理

针对/api/开头的请求,直接返回JSON格式的404错误,避免返回HTML页面:

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
    appBuilder.UseStatusCodePages(async context =>
    {
        var response = context.HttpContext.Response;
        if (response.StatusCode == 404 && !response.HasStarted)
        {
            response.ContentType = "application/json";
            await response.WriteAsJsonAsync(new { message = "API端点不存在", statusCode = 404 });
        }
    });

    appBuilder.UseRouting();
    appBuilder.UseEndpoints(endpoints => endpoints.MapControllers());
});

2. Blazor Server页面的404处理

先在服务器端拦截未匹配的路由,返回404状态码,再渲染自定义NotFound组件:

步骤1:创建自定义NotFound组件(NotFound.razor)

@page "/not-found"
<h1>页面不存在</h1>
<p>您访问的页面地址有误,请检查后重试。</p>

步骤2:配置Blazor请求的中间件逻辑

app.UseWhen(context => !context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
    // 触发状态码页面重定向
    appBuilder.UseStatusCodePagesWithReExecute("/error/{0}");

    appBuilder.UseRouting();
    appBuilder.UseEndpoints(endpoints =>
    {
        endpoints.MapBlazorHub();
        endpoints.MapFallbackToPage("/_Host");

        // 拦截未匹配路由,设置404状态码
        endpoints.MapFallback(async context =>
        {
            context.Response.StatusCode = 404;
            await context.Response.WriteAsync("");
        });
    });
});

步骤3:创建状态码渲染页面(Pages/Error/404.cshtml)

@page "/error/404"
@{
    Layout = "_Host";
    ViewData["Title"] = "页面不存在";
}

<component type="typeof(NotFound)" render-mode="Server" />

二、效果验证

  • 访问不存在的API端点:返回404状态码 + JSON错误信息
  • 访问不存在的Blazor页面:返回404状态码 + 自定义NotFound页面

三、规避IHttpContextAccessor的原因

Blazor Server组件运行在SignalR连接上下文,直接使用IHttpContextAccessor可能因上下文复用引发线程安全问题。上述方案在服务器中间件层处理请求,完全符合Blazor生命周期规范,无需依赖该组件。

内容的提问来源于stack exchange,提问作者Валентин Никин

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:52:15