.NET 5 ASP.NET MVC REST API如何捕获URL参数解析错误?
如何在C#后端代码中捕获URL参数解析类错误?
问题背景
当HTTP GET请求的URL中传入超出32位整数范围的参数时(例如请求www.domain.net/api/product/222222222222222222222222222222222222),API会返回模型验证错误响应,但这类错误无法被现有异常捕获中间件处理。
错误响应示例:
{ "errors": { "productIdInteger": [ "The value '222222222222222222222222222222222222' is not valid." ] }, "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "00-f6a8a724853f3f44ba9fc6468a42ad94-aca067537e73b645-00" }
现有中间件的局限
已通过app.UseMiddleware()添加的异常捕获中间件,仅能处理控制器方法抛出的异常,无法捕获URL参数解析错误或HTTP Body无效JSON解析错误。中间件核心代码如下:
public async Task Invoke(HttpContext context) { try { await _next(context); } catch (Exception ex) { // 仅在控制器方法抛出异常时执行,参数溢出场景不会触发 await MyExceptionHandlerAsync(context, ex); } }
解决方案
通过以下四步实现统一错误处理,覆盖三类场景:控制器业务错误(非异常)、控制器/调用方法抛出的异常、模型验证错误(如参数溢出):
- 创建包含错误标识和错误列表的返回基类
- 控制器返回对象继承该基类,统一业务数据字段命名
- 在Startup.cs中配置模型验证错误处理器,返回统一格式
- 修改异常中间件,用统一基类返回错误信息
相关代码示例
// 统一返回基类 public class ReturnBaseClass { public ReturnBaseClass() { errorList = new List<string>(); } public bool errorFlag { get; set; } public List<string> errorList { get; set; } } // 控制器业务返回示例 public class CourseDataReturn : ReturnBaseClass { // 统一命名为ReturnData,简化前端处理 public CourseInfo ReturnData { get; set; } } // 业务数据实体 public class CourseInfo { public int CourseId { get; set; } public string CourseName { get; set; } }
额外优化
将后端API返回的HTTP状态码简化为三类:OK、Bad Request、Internal Server Error,其余状态码归为HTTP传输错误(如超时、URL不存在),解决REST规范中NotFound状态码的歧义问题。
内容的提问来源于stack exchange,提问作者snj
相关产品推荐
相关产品推荐

