我正在使用asp.net webapi2的newtonsoft json.net库版本9,并将以下json发送到我的方法
{
id:1,
items:[{
foo:1.23
}]
}
在服务器上,项目集合具有类型的Bar[]
,其中bar为
public class Bar
{
public int Foo { get; set; }
}
不幸的是,在尝试将1.23转换为int
时,我的方法没有引起一个空数阵列,而不是尝试将1.23转换为CC_2的异常。
显然,这个问题与此问题相似,https://github.com/jamesnk/newtonsoft.json/issues/654,不应以高于6的版本出现,但是我们如前所述,在版本中提到,9(当前最新)。
我可以做出任何形式的配置以防止这种沉默行为吗?我处于企业环境中,希望有例外而不是数据丢失。
update
作为短期解决方案,我配置了异常处理,如下所示
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;
};
目前,最重要的是,我得到的无效,而不是整个方法参数,这更好。正如下面DBC建议的那样,看起来错误确实被丢弃了,但是在请求绑定期间只是吞下了错误。使用新处理程序,它没有。继续研究。
看起来与WebAPI/MVC有关,因为它们不认为部分无效的模型理由无法停止执行。
如https://learn.microsoft.com/en-us/aspnet/web-api/web-api/overview/formats-and-model--绑定/模型 - 验证式载主 - 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);
}
}
}