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

ASP.NET MVC Core 2应用无效路由返回空白页问题排查

为什么无效路由返回空白页?

嘿,这个问题我之前踩过坑!你用的app.UseExceptionHandler和app.UseDeveloperExceptionPage都是用来处理应用运行时抛出的未处理异常的,但访问不存在的路由属于HTTP 404 NotFound 状态——这类请求根本没触发任何异常,只是没有匹配到任何已定义的路由,所以这两个中间件完全不会生效,空白页就是ASP.NET Core在没配置404处理逻辑时的默认输出。

怎么解决?

针对ASP.NET Core 2 MVC的开发环境,给你几个靠谱的解决步骤:

1. 先确认路由配置没问题

首先检查Startup.cs的Configure方法里,有没有正确配置MVC路由,这是基础:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

如果路由配置缺失,请求连基础的路由匹配都走不了,但更关键的是下面的404处理逻辑。

2. 添加自定义404错误页面(推荐方案)

在Configure方法里,一定要放在UseMvc之前,添加状态码页面中间件:

// 开发环境下,把404这类状态码请求转发到指定的错误页面路由
app.UseStatusCodePagesWithReExecute("/Home/Error/{0}");

然后去HomeController里修改Error方法,让它能接收状态码参数:

public IActionResult Error(int? statusCode = null)
{
    if (statusCode.HasValue)
    {
        if (statusCode == 404)
        {
            ViewBag.ErrorMsg = "哎呀,你访问的页面跑丢啦!";
        }
        // 其他状态码比如500也可以在这里加对应逻辑
    }
    return View();
}

再确保Views/Home/Error.cshtml视图已经建好,能显示自定义的错误信息,比如:

@{
    ViewData["Title"] = "出错啦";
}

<h1 class="text-danger">页面找不到</h1>
@if (ViewBag.ErrorMsg != null)
{
    <p>@ViewBag.ErrorMsg</p>
}
<p>请检查你的URL是否正确,或者返回<a href="/">首页</a>试试。</p>

3. 快速测试的极简方案

如果只是想先看到非空白的反馈,不想自定义页面,可以先加这个简单的中间件:

app.UseStatusCodePages();

这样访问无效路由时,会直接返回Status Code: 404; Not Found的文本,至少不会是空白页。

4. 注意中间件的执行顺序!

ASP.NET Core的中间件是按顺序执行的,正确的顺序应该是:

  • 异常处理中间件(UseDeveloperExceptionPage)
  • 状态码页面中间件(UseStatusCodePagesWithReExecute)
  • 静态文件中间件(UseStaticFiles)
  • MVC路由中间件(UseMvc)

给你个完整的Configure方法示例参考:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        // 先加404处理
        app.UseStatusCodePagesWithReExecute("/Home/Error/{0}");
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseStatusCodePagesWithReExecute("/Home/Error/{0}");
    }

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

5. IIS配置小细节(部署时必看)

因为你部署在IIS上,还要确保IIS没接管404错误处理。可以在web.config里加这段配置,让ASP.NET Core自己处理404:

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="PassThrough" />
</system.webServer>

这样IIS就不会把ASP.NET Core返回的404替换成它自己的默认页面了。

验证效果

配置完之后重启IIS或者重新发布应用,访问个不存在的路由(比如/test/abc),应该就能看到你自定义的404页面了,开发环境下也能清晰看到错误提示,不会再是空白页啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:33:47