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

.NET Core 2.0路由中如何在错误请求时返回404状态码

在.NET Core 2.0中处理错误请求并返回404状态码

我来帮你解决这个问题——首先得先指出你当前Startup配置里的几个关键问题,再给出针对性的解决方案:

你当前代码的核心问题

  1. 中间件顺序错误:.NET Core的中间件是按注册顺序执行的,你把UseExceptionHandler放在了UseMvc之后,而且最后的app.Run(...)会捕获所有未被前面中间件处理的请求,这直接导致MVC的404逻辑根本没机会触发,反而返回了"Web API running!"。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:19:00