我使用带有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所建议的那样,看起来错误确实被抛出,但在请求绑定期间被简单地吞没了。使用新的处理程序,它没有。继续研究。
答案 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);
}
}
}