尝试将浮点解析为int

时间:2017-03-14 19:00:17

标签: c# json json.net asp.net-web-api2

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

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

在服务器上,items集合的类型为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所建议的那样,看起来错误确实被抛出,但在请求绑定期间被简单地吞没了。使用新的处理程序,它没有。继续研究。

1 个答案:

答案 0 :(得分:0)

看起来问题与WebApi / MVC有关,因为他们没有考虑部分无效的模型原因来停止执行。

我们现在添加了一个特殊属性来实现我们的基本API控制器,如https://docs.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);
        }
    }
}