在WebAPI C#中请求反序列化期间捕获exception#

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

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

我知道这个方法中的代码存在问题,我已经逐步完成并找到了它。 对我来说问题是我完全没有例外。 发生的事情是这个方法被跳出来,exception似乎被忽略了。 我的控制器操作被调用,我的目标对象未正确填充,因为此序列化方法未正确执行。

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

我已经编写了一个filter(如各种注释中所建议的),它检查ModelState并在发生序列化错误时抛出exception。 但要注意,这可能不仅包含序列化exception – 可以通过在Select语句中指定具体的exception类型来调整。

 public class ValidModelsOnlyFilter : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext.ModelState.IsValid) { base.OnActionExecuting(actionContext); } else { var exceptions = new List(); 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); } } } 

我建议在全局范围内绑定此filter。 我真的无法理解为什么忽略反序列化exception应该没问题。

我有完全相同的问题,并将您的问题加入书签,希望有人能提供解决方案。 我认为使用ModelState隐含了重写JSON模型中的一些validation,但它只是起作用,事实上它很简单,做得很好。 我没有必要修改模型,只需要修改控制器。

我的一个控制器的代码,StdResponse是用于在需要时提供响应的类(例如,在这种情况下):

 [HttpPost] public StdResponse Test([FromBody]StdRequest request) { if (ModelState.IsValid) { //Work on the data from the request... } else { //Retrieve the exceptions raised during deserialization var errors = ModelState.SelectMany(v => v.Value.Errors.Select(e => e.Exception)); List messages = new List(); foreach (Exception e in errors) { messages.Add(e.GetType().ToString() + ": " + e.Message); } return new StdResponse(exchangeVersion, "null", ExecutionResponse.WithError("StdRequest invalid", messages)); } } 

您可以在控制器中检查ModelState.IsValid 。 如果“OnDeserialisedMethod”抛出exception(或任何其他模型validation失败),则它将为false ,如果一切都成功,则为true。