.NET Core 2.0路由中如何在错误请求时返回404状态码
在.NET Core 2.0中处理错误请求并返回404状态码
我来帮你解决这个问题——首先得先指出你当前Startup配置里的几个关键问题,再给出针对性的解决方案:
你当前代码的核心问题
- 中间件顺序错误:.NET Core的中间件是按注册顺序执行的,你把
UseExceptionHandler放在了UseMvc之后,而且最后的app.Run(...)会捕获所有未被前面中间件处理的请求,这直接导致MVC的404逻辑根本没机会触发,反而返回了"Web API running!"。 - MVC未配置路由规则:你只调用了
app.UseMvc()但没定义任何路由模板,MVC无法识别有效的API路由,自然也无法正确返回404。
方案1:修正中间件顺序+配置基础路由
调整你的Configure方法,按正确顺序注册中间件,并添加API路由模板:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 开发环境用开发者异常页,生产环境用统一异常处理 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/error"); // 可自定义错误页或API端点 } // CORS中间件必须放在MVC之前,否则不生效 app.UseCors(builder => builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials() ); // 配置MVC路由,定义API的默认路由规则 app.UseMvc(routes => { routes.MapRoute( name: "api-default", template: "api/{controller}/{action}/{id?}"); }); // 移除最后的app.Run(...),它会覆盖所有未处理请求的响应,包括404 }
这样配置后,当请求不匹配任何api/xxx格式的路由时,MVC会自动返回404状态码。
方案2:自定义404响应(适合API场景)
如果想给Angular前端返回更友好的JSON格式错误信息,可以添加一个中间件捕获404并自定义响应:
在UseMvc之后添加以下代码:
app.Use(async (context, next) => { await next(); // 仅当响应是404且还未开始发送时,自定义响应 if (context.Response.StatusCode == 404 && !context.Response.HasStarted) { context.Response.ContentType = "application/json"; var errorInfo = new { StatusCode = 404, Message = "请求的资源不存在", Timestamp = DateTime.UtcNow }; // 需要引用Newtonsoft.Json包(NuGet安装) await context.Response.WriteAsync(Newtonsoft.Json.JsonConvert.SerializeObject(errorInfo)); } });
针对Angular SPA的额外提示
如果你的Angular是单页应用,要避免前端路由被后端误拦截,可以在MVC路由后添加一段逻辑:
app.Use(async (context, next) => { await next(); // 非API请求(无文件扩展名)且返回404时,返回Angular的index.html if (context.Response.StatusCode == 404 && !Path.HasExtension(context.Request.Path.Value)) { context.Request.Path = "/index.html"; await next(); } });
这样既保证了错误的API请求返回404,又不会影响Angular的前端路由跳转。
内容的提问来源于stack exchange,提问作者user9326447
相关产品推荐
相关产品推荐

