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

