我有一个应用程序,在启动时,我注册 NewtonSoft 并在序列化时记录错误。当我检查我的应用程序日志时,我可以看到有错误日志,但我无法定位或重新创建错误。
错误:Failed during serialization: MoveNextAction.Method.ReturnTypeCustomAttributes
启动文件
.AddControllersAsServices().AddNewtonsoftJson(options =>
{
options.UseMemberCasing();
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
options.AllowInputFormatterExceptionMessages = true;
options.SerializerSettings.Formatting = Formatting.None;
options.SerializerSettings.ContractResolver = new DefaultContractResolver
{
NamingStrategy = null
};
options.SerializerSettings.Error = (sender, args) =>
{
_logger.LogError($"Failed during serialization: {args.ErrorContext.Path}", args.ErrorContext.Error);
args.ErrorContext.Handled = true;
};
})
我在我的应用程序中搜索了 系列 我也使用 DeserializeObject
JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonValue);
我尝试将 jsonValue 设置为 null 但不幸的是没有触发 SerializerSettings.Error。任何有关生成 SerializerSettings 错误或调试的提示或建议将不胜感激。
最佳答案
您可以通过传递与 Controller 参数中指定的模型类相比无效的 JSON 请求正文来实现此目的。
定义一个带有 int 字段的模型类,然后发送一个 HTTP 请求,其中该字段的 JSON 中有一个字符串值。
这将作为默认值传递给 Controller ,在您的情况下,也应该执行错误处理程序。
这是一个工作示例:
public class HomeController : Controller
{
public class MyRequest
{
public int MyField { get; set; }
}
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
[HttpPost]
public IActionResult Test([FromBody] MyRequest myRequest)
{
return Ok();
}
}
如果您 POST 到/Home/Test 值{
"MyField": "test"
}
那么你的错误处理程序将被调用,并且 args.ErrorContext.Path
的值将是 MyField
虽然,args.ErrorContext.Error
的值将是 Message = "Could not convert string to integer: test. Path 'MyField', line 2, position 18."
我想我需要对您的代码有更深入的了解才能准确重现错误,但我希望这会有所帮助。
关于c# - 如何手动触发 JsonSerialization 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67839562/