反序列化失败时,System.Web.Http.ApiController给出null参数

时间:2016-03-18 11:37:03

标签: c# .net json.net json-deserialization asp.net-apicontroller

我有一个自定义的JsonConverter实现,它作为参数传递给其他POST方法。

在某些情况下,JsonConverter会抛出异常。发生这种情况时,将使用对象的空值调用其余POST方法,而不是像我期望的那样将500返回到客户端。 这意味着我无法向客户端提供有意义的错误。

如何更改或解决此问题?

using System.Web.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace MyControllers
{
  class MyConverter: JsonConverter
  {
...
      public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
      {
        throw new Exception("You can't do that");
      }
   }
  [JsonConverter(typeof(MyConverter))]
  public class MyClass
  {
...
  }
  public class MyController : ApiController
  {
    public string Post([FromBody]MyClass MyObject)
    {
      // Method is invoked with null value for MyObject
    }
  }
}

1 个答案:

答案 0 :(得分:0)

基于这个答案我有一个解决方法 https://stackoverflow.com/a/32950529/1273906 每个API类都有一个ModelState属性,其中包含反序列化期间引发的任何异常。

所以我现在在我的api基类上创建了这个方法:

protected void CheckForDeserializationErrors()
{
  foreach (Exception ex in ModelState.SelectMany(v => v.Value.Errors.Select(e => e.Exception)))
  {
    throw new Newtonsoft.Json.JsonException(ex.Message, ex);
  }
}

所以对CheckForDeserializationErrors()的简单调用作为任何API方法的第一行就足以重新抛出任何反序列化错误