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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 20:50:31