Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当出现JSON解析器错误(例如类型不匹配)时,Asp.Net核心API模型绑定的错误请求消息是否不清楚?_C#_Asp.net Core_Asp.net Core Webapi_Model Binding_Bad Request - Fatal编程技术网

C# 当出现JSON解析器错误(例如类型不匹配)时,Asp.Net核心API模型绑定的错误请求消息是否不清楚?

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中有没有更好的方法来

如果我发送的JSON正文类型错误(例如,Asp.Net Core在模型中需要字符串的整数),我会收到以下消息:

“$.name”:[ 无法将JSON值转换为System.String.Path:$.name |行号:1 | BytePositionLine:11 ]

对于Web Api的随机用户来说,这些信息不是很清楚。此外,如果enum发生相同的错误,它还将泄漏有关enum的完全限定名(包括命名空间)的信息,并且对用户来说比
System.String
更有意义

在WebApi中有没有更好的方法来处理这个问题?例如,将所有消息更改为通用的
值不是预期的类型
或类似的类型

我知道两种可能的解决方案,但都相当麻烦:

  • 所有模型都应该接受string(虽然我们仍然会得到带有string的模型,但至少或多或少可以理解)或object(如果可能的话)。然后,所有的验证和映射都应该手动完成
  • 为模型中使用的每种类型编写转换器,并将其提供给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库,是否也可以这样做?我还没有尝试过。可能您必须编写带有修改异常消息的自定义转换器。这会有帮助:不管怎样,谢谢你的提示,我会检查那里是否有可以做的事情