我们有 ASP.NET Core应用程序,我们将其用作REST api。方法使用[FromBody]MyClass param
作为输入。问题是,如果客户端发送无效的 JSON 字符串,则由于 JSON 序列化错误,input
值变为 null。有没有办法记录此类错误?
编辑:我正在寻找应用程序范围的解决方案,而不是每种方法。
我已经通过在 Startup 中添加错误处理程序来解决这个问题.cs:
services.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.Error = (object sender, Newtonsoft.Json.Serialization.ErrorEventArgs args) =>
{
//Log args.ErrorContext.Error details...
};
});
可以使用操作筛选器捕获任何模型绑定错误(包括反序列化错误)。 您可以从 ActionExecutingContext 中提取错误。
编辑:若要使用此方法,需要禁止显示模型状态无效筛选器,因为默认情况下,如果出现绑定错误,Web api 将自动返回 400。 https://learn.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)
{
}
}