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()
的简单调用就足以重新抛出任何反序列化错误
我有一个 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:
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()
的简单调用就足以重新抛出任何反序列化错误