C# 当出现JSON解析器错误(例如类型不匹配)时,Asp.Net核心API模型绑定的错误请求消息是否不清楚?
如果我发送的JSON正文类型错误(例如,Asp.Net Core在模型中需要字符串的整数),我会收到以下消息: “$.name”:[ 无法将JSON值转换为System.String.Path:$.name |行号:1 | BytePositionLine:11 ] 对于Web Api的随机用户来说,这些信息不是很清楚。此外,如果enum发生相同的错误,它还将泄漏有关enum的完全限定名(包括命名空间)的信息,并且对用户来说比C# 当出现JSON解析器错误(例如类型不匹配)时,Asp.Net核心API模型绑定的错误请求消息是否不清楚?,c#,asp.net-core,asp.net-core-webapi,model-binding,bad-request,C#,Asp.net Core,Asp.net Core Webapi,Model Binding,Bad Request,如果我发送的JSON正文类型错误(例如,Asp.Net Core在模型中需要字符串的整数),我会收到以下消息: “$.name”:[ 无法将JSON值转换为System.String.Path:$.name |行号:1 | BytePositionLine:11 ] 对于Web Api的随机用户来说,这些信息不是很清楚。此外,如果enum发生相同的错误,它还将泄漏有关enum的完全限定名(包括命名空间)的信息,并且对用户来说比System.String更有意义 在WebApi中有没有更好的方法来
System.String
更有意义
在WebApi中有没有更好的方法来处理这个问题?例如,将所有消息更改为通用的值不是预期的类型
或类似的类型
我知道两种可能的解决方案,但都相当麻烦:
我真的希望有更好的方法让我们能够从解析器“捕获”异常或从默认转换器继承异常,等等。您的API测试/调试版本应该提供有关请求错误的详细信息,并且您还应该在公共文档中提供有关这些错误的信息 您的发布版本应该隐藏所有这些细节,并返回某种4XX 这意味着每个公共API都应该类似于:
public IActionResult MyApiFunction()
{
try
{
... do something
}
catch(Exception ex)
{
... do some logging
return BadRequest();
}
}
底线是API的用户没有遵守规范,因此这是一个错误的请求。如果您使用的是NewtonsoftJson,请在
Startup.cs
中使用此设置。它将给出“输入无效”。
.AddNewtonsoftJson(选项=>
{
options.AllowInputFormatterExceptionMessages=false;
});
“对于Web Api的随机用户来说,这些信息不是很清楚”,不是吗?发布模式不会隐藏所有内部错误消息吗?不,对于用户(不是这个特定API的开发人员,特别是如果他们从未使用过.Net)来说,这不是很清楚,但我没有尝试更改为发布模式,我认为这不会影响输出,我会检查它是否有。发布模式不会改变任何不幸的事情。好吧,我明白,这正是我想要的,关键是我不知道如何做到这一点。在作为框架一部分的模型绑定过程中,我不能这样做try/catch。所以我的问题是如何做到这一点不,你绝对不应该把每个动作方法都封装在样板文件try-catch块中。ASP.NET(MVC)中还有很多其他地方可以配置错误处理。我确实使用了新的.NET核心json库,是否也可以这样做?我还没有尝试过。可能您必须编写带有修改异常消息的自定义转换器。这会有帮助:不管怎样,谢谢你的提示,我会检查那里是否有可以做的事情