gpt4 book ai didi

c# - 尝试将浮点解析为 int 时,Web API 2 中的 Newtonsoft JSON 反序列化无提示地失败

转载 作者:太空宇宙 更新时间:2023-11-03 15:07:14 27 4
gpt4 key购买 nike

我将 Newtonsoft Json.NET 库版本 9 与 ASP.NET WebApi2 一起使用,并将以下 JSON 发送到我的方法

{
id:1,
items:[{
foo:1.23
}]
}

在服务器上,项目集合的类型为 Bar[],其中 Bar 是

public class Bar
{
public int Foo { get; set; }
}

不幸的是,我的方法没有像我预期的那样在尝试将 1.23 转换为 int 时抛出异常,而是在 Items 集合为空数组的情况下被调用。

显然,问题类似于这个问题,https://github.com/JamesNK/Newtonsoft.Json/issues/654 ,并且不应出现在高于 6 的版本中,但如前所述,我们出现在版本 9(当前最新)上。

是否可以进行任何配置来防止这种无声行为?我在企业环境中,希望抛出异常而不是数据丢失。

更新

作为短期解决方案,我配置了异常处理,如下所示

GlobalConfiguration.Configuration.Formatters
.JsonFormatter.SerializerSettings.Error += (o, e) =>
{
// this errors bubble through each parent, we only want to log once.
if (e.CurrentObject == e.ErrorContext.OriginalObject)
{
_logger.Error(e.ErrorContext.Error.Message, e.ErrorContext.Error);
}
throw e.ErrorContext.Error;
};

至少现在,我得到的是 null 而不是整个方法参数,这样更好。正如下面 Dbc 所建议的,看起来错误确实被抛出,但随后在请求绑定(bind)期间被简单地吞没了。对于新的处理程序,它不会。继续研究。

最佳答案

看起来问题出在 WebApi/MVC 上,因为他们没有考虑到足以停止执行的部分无效模型原因。

我们现在已经添加了一个特殊的属性来实现我们的基本 API Controller ,如 https://learn.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api 中所述。

public class ValidateModelAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(
HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}

关于c# - 尝试将浮点解析为 int 时,Web API 2 中的 Newtonsoft JSON 反序列化无提示地失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42794410/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com