【问题标题】:How to log ASP.NET Core input JSON serialization errors如何记录 ASP.NET Core 输入 JSON 序列化错误
【发布时间】:2017-10-26 07:37:25
【问题描述】:

我们有用作 REST api 的 ASP.NET Core 应用程序。方法使用[FromBody]MyClass param 作为输入。问题是如果客户端发送一个无效的 JSON 字符串,input 值会因为 JSON 序列化错误而变为空。有没有办法记录此类错误?

编辑:我正在寻找应用程序范围的解决方案,而不是每个方法..

【问题讨论】:

  • @Kirk:这不是同一个问题。链接的问题询问如何将 json 错误返回给调用者,并且接受的答案是基于方法的解决方案。我希望在应用程序范围内捕获并记录它们。
  • 您是否阅读了第二个未接受的答案,该答案描述了如何使用过滤器来完全满足您的要求?
  • @Kirk:我没看到,我的错。我已经以不同的方式解决了我正在寻找的问题,感谢您指出。

标签: rest asp.net-core json.net asp.net-core-mvc


【解决方案1】:

我通过在 Startup.cs 中添加错误处理程序解决了这个问题:

services.AddMvc()
        .AddJsonOptions(options => {
              options.SerializerSettings.Error = (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args) =>
              {
                    //Log args.ErrorContext.Error details...
              };
        });

【讨论】:

  • 是的,我同意,但是注入 LoggerFactoryManager.Init(_); 时如何记录它在同一个 ConfigureServices 方法中?
  • var logger = LoggerFactoryManager.GetLogger(); logger.LogWarning("反序列化 JSON 输入失败:" + args.ErrorContext.Error.Message);
【解决方案2】:

您可以使用操作过滤器来捕获任何模型绑定错误(包括反序列化错误)。您可以从 ActionExecutingContext 中提取错误。

编辑:要使用这种方法,您需要抑制模型状态无效过滤器,因为默认情况下,如果存在绑定错误,web api 将自动返回 400。 https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.apibehavioroptions.suppressmodelstateinvalidfilter#microsoft-aspnetcore-mvc-apibehavioroptions-suppressmodelstateinvalidfilter

    public class LogModelBindingErrorFilter : IActionFilter
    {
        private readonly ILogger _logger = LogManager.GetCurrentClassLogger();

        public void OnActionExecuting(ActionExecutingContext context)
        {
            if (!context.ModelState.IsValid)
            {
                var messages = context.ModelState.Values
                    .SelectMany(x => x.Errors)
                    .Where(x => x.Exception is JsonException)
                    .Select(x => x.ErrorMessage);

                _logger.Log(LogLevel.Error, string.Join(", ", messages));
            }
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
        }
    }

【讨论】:

猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
相关资源
最近更新 更多