我有一个自定义的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
}
}
}
答案 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方法的第一行就足以重新抛出任何反序列化错误