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

System.Web.Http.ApiController gives null parameter when deserialization fails

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

在某些情况下,JsonConverter 会抛出异常。发生这种情况时,将调用 rest 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
    }
  }
}

基于这个答案我有一个解决方法 每个 API class 都有一个 ModelState 属性,其中包含反序列化期间引发的任何异常。

所以我现在已经在我的 api 基础上创建了这个方法 class:

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);
  }
}

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