C# 将POST和PUT请求的负载获取为null

C# 将POST和PUT请求的负载获取为null,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,我制作了POST和PUT API,现在我正在进行属性验证 模型 邮递员的有效载荷 { "user_identifier": "1234", "name": "abcd" } 它适用于此,但当我更改用户标识符的类型时 { "user_identifier": 1234, "name": "abcd" } Postman为该属

我制作了POST和PUT API,现在我正在进行属性验证

模型

邮递员的有效载荷

{
    "user_identifier": "1234",
    "name": "abcd"
}
它适用于此,但当我更改用户标识符的类型时

{
    "user_identifier": 1234,
    "name": "abcd"
}
Postman为该属性提供了一个自动400错误,我不想这样,因为我正在进行我自己的验证,所以我添加了这个来抑制那些自动400响应

services.Configure<ApiBehaviorOptions>(options =>
{
    options.SuppressModelStateInvalidFilter = true;
});
有效负载被认为是空的,有人能帮我解决这个问题吗,而且我认为抑制自动响应不好,如果有其他选择,我们将不胜感激


提前感谢。

主要问题是,当您的json如下图所示时,它表示
user\u标识符
int
,但您表示它应该是
字符串

{
    "user_identifier": 1234,
    "name": "abcd"
}
这是新创建的api项目返回的错误

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|8c6385fc-4816d0c11a257a60.",
    "errors": {
        "$.user_identifier": [
            "The JSON value could not be converted to System.String. Path: $.user_identifier | LineNumber: 1 | BytePositionInLine: 27."
         ]
    }
}

一旦您知道这是问题所在(假设您使用的是ASP.NET Core>=3.0.0),您就可以在ASP.NET Core 3.0.0中找到它们是如何从Json.NET迁移而来的。一个选项是安装
Microsoft.AspNetCore.Mvc.NewtonsoftJson
并将其添加到startup
services.AddControllers().AddNewtonsoftJson()中

在下面的文档中,我们可以发现
System.Text.Json
不支持字符串属性的非字符串值,这导致了这个问题

如@Shoejep所述,为了允许ASP.NET Core 3+项目中的字符串属性使用非字符串JSON值,我们可以添加Newtonsoft.JSON(JSON.NET)通过安装
Microsoft.AspNetCore.Mvc.NewtonsoftJson
包并更新
Startup.ConfigureServices
以调用
AddNewtonsoftJson
方法来支持我们的项目


谢谢大家的帮助

我无法找到验证属性的方法,因此.Net不会自动给出
400 BadRequest
响应

我发现了问题所在,这是因为我使用Post请求参数中的
[FromBody]PayloadModel payload
获取有效负载

现在,我改变了我的方法,使用

var streamReader = new StreamReader(Request.Body);
string requestBody = await streamReader.ReadToEndAsync();
var payload = JsonConvert.DeserializeObject<PayloadModel>(requestBody);

这样,我对有效负载验证有了更精细的控制。

这需要在代码中进行一些设计,因为验证是在模型绑定之后运行的。您的错误(导致400)由模型绑定引发,在本例中,该绑定基于
IInputFormatter
(用于json)。该格式化程序无法反序列化模型,因为字符串和数字之间的类型不匹配。您可能必须创建自己的
IInputFormatter
,或者以某种方式调整json反序列化器以接受类型不匹配,但必须在反序列化模型中提供提示,指示其无效,以便下次验证可以验证它。使用Automapper将模型映射到您的模型是相当复杂的,因此您不需要抑制模型状态validationHi@AshwinPandey,有关于此案例的更新吗
System.Text.Json
不支持字符串属性的非字符串值,这会导致问题。在你的项目中添加Newtonsoft.Json(Json.NET)支持对你有用吗?@FeiHan我写了答案,你可以看看,我基本上改变了接收有效负载的方法,通过这样做,我对有效负载验证有了更多的控制。
{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|8c6385fc-4816d0c11a257a60.",
    "errors": {
        "$.user_identifier": [
            "The JSON value could not be converted to System.String. Path: $.user_identifier | LineNumber: 1 | BytePositionInLine: 27."
         ]
    }
}
var streamReader = new StreamReader(Request.Body);
string requestBody = await streamReader.ReadToEndAsync();
var payload = JsonConvert.DeserializeObject<PayloadModel>(requestBody);
public class PayloadModel 
{
    [JsonProperty("user_identifier")]
    public string UserIdentifier { get; set; }
    
    [JsonProperty("name")]
    public string name { get; set; }
}