如果 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 属性转换为对象

来自json的web api 2绑定模型

Angular 2/Web Api - json 解析错误语法错误意外结束输入

使用 json_encode,有没有办法强制某些值不转换为数字?