一尘不染

在WebAPI C#中的请求反序列化期间捕获异常

json

我正在使用WebAPI
v2.2,并且正在使WebAPI使用[FromBody]属性将JSON反序列化到对象上。反序列化的目标类在内部方法上具有[OnDeserialized]属性,如下所示:

[OnDeserialized]
internal void OnDeserialisedMethod(StreamingContext context) {
    // my method code
}

我知道事实是此方法中的代码有问题,我已逐步解决并找到了它。对我来说,问题是我一点也不例外。发生的情况是此方法被跳出,异常似乎被忽略了。因为未正确执行此序列化方法,所以调用了我的控制器操作并且未正确填充目标对象。

我的问题是;如何捕获WebAPI反序列化期间发生的异常?


阅读 321

收藏
2020-07-27

共1个答案

一尘不染

我编写了一个过滤器(如各种注释中所建议),该过滤器检查ModelState并在确实发生序列化错误时引发异常。但是请注意,它可能不只包含序列化异常-
可以通过在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);
        }
    }
}

我建议将此过滤器绑定到全局范围。我真的无法理解为什么应该可以忽略反序列化异常。

2020-07-27