我正在使用WebAPI v2.2,并且正在使WebAPI使用[FromBody]属性将JSON反序列化到对象上。反序列化的目标类在内部方法上具有[OnDeserialized]属性,如下所示:
[OnDeserialized] internal void OnDeserialisedMethod(StreamingContext context) { // my method code }
我知道事实是此方法中的代码有问题,我已逐步解决并找到了它。对我来说,问题是我一点也不例外。发生的情况是此方法被跳出,异常似乎被忽略了。因为未正确执行此序列化方法,所以调用了我的控制器操作并且未正确填充目标对象。
我的问题是;如何捕获WebAPI反序列化期间发生的异常?
我编写了一个过滤器(如各种注释中所建议),该过滤器检查ModelState并在确实发生序列化错误时引发异常。但是请注意,它可能不只包含序列化异常- 可以通过在Select语句中指定具体的异常类型来进行调整。
Select
public class ValidModelsOnlyFilter : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext.ModelState.IsValid) { base.OnActionExecuting(actionContext); } else { var exceptions = new List<Exception>(); foreach (var state in actionContext.ModelState) { if (state.Value.Errors.Count != 0) { exceptions.AddRange(state.Value.Errors.Select(error => error.Exception)); } } if (exceptions.Count > 0) throw new AggregateException(exceptions); } } }
我建议将此过滤器绑定到全局范围。我真的无法理解为什么应该可以忽略反序列化异常。