.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,提问作者Валентин Никин
相关产品推荐
相关产品推荐

