ASP.NET Core MVC中BadRequest(exception)无法被ErrorController捕获的疑问
先看你配置的中间件代码:
app.UseExceptionHandler("/Errors/Error"); app.UseStatusCodePagesWithReExecute("/Errors/Error/{0}"); app.UseStatusCodePagesWithRedirects("/Errors/Error/{0}"); app.UseHsts();
核心原因分析
UseExceptionHandler的触发条件:这个中间件只负责捕获未被代码处理的异常——也就是未被try/catch捕获,或者catch块中重新抛出的异常。当你返回
BadRequest()时,只是生成了一个400状态码的空响应,没有触发异常抛出流程,但UseStatusCodePagesWithReExecute会拦截这种无内容的状态码响应,重新执行/Errors/Error/{0}路由,所以最终是ErrorController处理的结果。BadRequest(ex)的响应逻辑:调用
BadRequest(ex)时,ASP.NET Core会直接把异常对象序列化为响应内容(默认是JSON格式),同时返回400状态码。这里的关键是,你是主动构造了包含异常信息的响应,并没有触发未处理异常的抛出流程。而UseStatusCodePagesWithReExecute默认只拦截没有响应内容的状态码请求,此时响应已经有了异常详情内容,中间件不会再触发重新执行路由的操作,客户端就直接拿到了异常详情。中间件顺序的额外说明:你同时配置了
UseStatusCodePagesWithReExecute和UseStatusCodePagesWithRedirects,这两个中间件互斥,只会执行第一个(UseStatusCodePagesWithReExecute),后面的不会生效,但这不是当前问题的核心。
解决方向
如果想让带异常的BadRequest也走ErrorController处理,你可以:
- 在catch块中记录异常后,返回
BadRequest()而非BadRequest(ex) - 在catch块中手动抛出异常,让
UseExceptionHandler捕获处理 - 自定义过滤器,统一处理包含异常对象的BadRequest响应
内容的提问来源于stack exchange,提问作者Atul Verma

