【问题标题】:Catch json.net serialization errors捕获 json.net 序列化错误
【发布时间】:2019-06-30 15:43:42
【问题描述】:

我正在使用 dotnet core 2.2 开发一个 web api,我们想要捕获序列化异常并返回 400 badRequest 以区分验证错误 422UnprocessableEntity。我们试图创建一个异常处理程序

public void JsonSerializerExceptionHandler(object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args)
    {
        args.ErrorContext.Handled = true;
        var errorContext = args.ErrorContext;
        if (errorContext == null)
        {
            return;
        }

        var error = errorContext.Error;
        throw new SerializationException(error.Message, error.InnerException);
    }

但是当它抛出它时会抛出另一个 InvalidOperationException 类型的异常,并带有消息

当前错误上下文错误与请求错误不同。

我们尝试了不同的方法,但找不到解决方案。有人可以帮忙吗?

【问题讨论】:

  • 我不确定您为什么要尝试实现这一目标。我只是将我的序列化代码包装在一个 try catch 中,如果您正在寻找序列化错误,只需为此添加一个特定的 catch 块。您可以编写一个专门在 MVC 层中的任何位置捕获这些的中间件。
  • 我们正在尝试实现这一点,因为它是来自客户端的请求,Json.net 本身不会抛出异常,如果我删除最后一行它根本不会抛出。

标签: asp.net-core json.net asp.net-core-webapi asp.net-core-2.2


【解决方案1】:

也许我的解决方案对某人有用。 我需要捕获 JSON.NET 序列化或反序列化异常并在我的 .NET Core 中间件中处理它。

在 JSON.NET SerializerSettings 中添加 rethrow json.net 异常

services.AddControllers().AddNewtonsoftJson(options => {


    //your options here
 

    options.SerializerSettings.Error += (sender, args) => throw args.ErrorContext.Error;

});

在中间件处理程序上添加 catch 并覆盖 JsonSerializationException:

if (exception is JsonSerializationException)
{
    var exceptionMessage = exception.InnerException != null ? 
       exception.InnerException.Message : exception.Message;

    exception = new BadRequestException(ApiErrorCode.InvalidResourceModel,
      exceptionMessage);
}

【讨论】:

  • 我偶尔会遇到动作参数为空的问题。他们很难调试,但到目前为止一直非常简单。这一个非常困难,所以我去搜索有关如何查看反序列化错误详细信息的信息。这个帖子很有用,谢谢!赞成。
猜你喜欢
  • 1970-01-01
  • 2015-02-16
  • 2011-12-09
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多