如果 web api json 转换器中的输入值不正确,我需要抛出啥异常,以便服务器返回 400 而不是 500?
Posted
技术标签:
【中文标题】如果 web api json 转换器中的输入值不正确,我需要抛出啥异常,以便服务器返回 400 而不是 500?【英文标题】:What exception I need to throw if input value was incorrect in web api json converter so server returns 400 instead of 500?如果 web api json 转换器中的输入值不正确,我需要抛出什么异常,以便服务器返回 400 而不是 500? 【发布时间】:2021-12-21 03:38:31 【问题描述】:我在 asp.net 中为时间跨度值使用了一个自定义 JSON 转换器(一个类继承自 JsonConverter<TimeSpan>
),但是当客户端发送一个不适合 TimeSpan 的值时,(例如客户端发送 45.12
这是根据默认(d.mm:hh:ss
)格式不是正确的值)我抛出异常。
然后asp.net core返回不正确的状态500给客户端。我希望 asp.net 返回 400 并显示一条消息“值 45.12
不是时间跨度的正确值”。
我怎样才能做到这一点?
下面是我的代码:
int[] parts = value.Split(':', StringSplitOptions.RemoveEmptyEntries).Select(x => int.Parse(x, CultureInfo.InvariantCulture)).ToArray();
if (parts.Length != 3)
throw new Exception($"Unable to parse `value` to valid TimeSpan because is not 3 parts");
return new TimeSpan(parts[0] / 24, parts[0] % 24, parts[1], parts[2]);
注意:
我知道上面的代码可以写成TimeSpan.ParseExat(value)
!但这不是我的问题!
我的问题不在于将字符串转换为时间跨度,反之亦然!
我的问题是关于如何在asp.net核心环境中处理这些情况。
【问题讨论】:
【参考方案1】:如果你在控制器本身,你应该使用ControllerBase.BadRequest方法而不是抛出异常。您可能还想考虑https://enterprisecraftsmanship.com/posts/advanced-error-handling-techniques/
【讨论】:
【参考方案2】:您必须在控制器中捕获异常并返回 BadRequest() 以生成“400 错误请求”响应。
【讨论】:
以上是关于如果 web api json 转换器中的输入值不正确,我需要抛出啥异常,以便服务器返回 400 而不是 500?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Web API将MV响应转换为MVC 4中的json List
Gson对象转json时,属性值不存在时转成的null问题??
在 Web API 调用上将字符串 JSON 属性转换为对象