C# Asp.net Core 2 API POST对象是否为空?
我有一个带有一些测试功能的.NETCore2API设置。(Visual Studio 2017) 我使用postman将原始数据发布到该方法,但模型只是空白?为什么?C# Asp.net Core 2 API POST对象是否为空?,c#,api,asp.net-core,C#,Api,Asp.net Core,我有一个带有一些测试功能的.NETCore2API设置。(Visual Studio 2017) 我使用postman将原始数据发布到该方法,但模型只是空白?为什么? // POST api/Product/test [HttpPost] [Route("test")] public object test(MyTestModel model) { try {
// POST api/Product/test
[HttpPost]
[Route("test")]
public object test(MyTestModel model)
{
try
{
var a = model.SomeTestParam;
return Ok("Yey");
}
catch (Exception ex)
{
return BadRequest(new { message = ex.Message });
}
}
public class MyTestModel
{
public int SomeTestParam { get; set; }
}
您需要在模型上包含
[FromBody
]属性:
[FromBody] MyTestModel model
有关更多信息,请参阅Andrew Lock's:
为了在ASP.NET Core中正确绑定JSON,您必须修改操作以在参数上包含属性[FromBody]
。这告诉框架使用请求的content-type头来决定将哪个配置的iInputFormatter用于模型绑定
正如@anserk在评论中指出的,这还需要将
内容类型
标题设置为application/json
,以向接受的答案添加更多信息:
有三个源,参数从中自动绑定而不使用属性:
表单值:这些是HTTP请求中使用的表单值
POST方法。(包括jQuery POST请求)
路由值:路由提供的路由值集
查询字符串:URI的查询字符串部分
请注意,Body
不是其中之一(尽管我认为应该是)
因此,如果需要从主体绑定值,则必须使用属性绑定属性
这让我昨天大吃一惊,因为我假设来自身体的参数会自动绑定
第二个次要问题是,只有一个参数可以绑定到主体
用[FromBody]修饰的每个操作最多只能有一个参数。ASP.NET核心MVC运行时将读取请求流的责任委托给格式化程序。一旦为某个参数读取了请求流,通常不可能再次读取该请求流以绑定其他[FromBody]参数
因此,如果需要多个参数,则需要创建一个模型类来绑定它们:
public class InputModel{
public string FirstName{get;set;}
public string LastName{get;set;}
}
[HttpPost]
public IActionResult test([FromBody]InputModel model)...
我花了几个小时来处理这个问题。这个问题有几个原因。让我们考虑的请求是Reactjs(JavaScript)和后端(API)是ASP.NET.Cype。 在请求中,必须在标题内容类型中设置:
Axios({
method: 'post',
headers: { 'Content-Type': 'application/json'},
url: 'https://localhost:44346/Order/Order/GiveOrder',
data: order,
}).then(function (response) {
console.log(response);
});
在后端(Asp.net core API)中,您必须有一些设置:
1。在启动-->配置服务中:
#region Allow-Orgin
services.AddCors(c =>
{
c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
});
#endregion
2。启动时-->在app.UseMvc()之前配置:
app.UseCors(builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
3。在控制器中执行操作之前:
[EnableCors("AllowOrigin")]
在我的例子中,我的.cs模型中缺少了{get;set;},这导致一个所有成员在POST上都为空的对象。他还需要在请求中设置正确的内容类型。它应该是
application/json
而不是text
。将ApiController
属性添加到类中也会起作用,这样您就不需要在参数中包含FromBody
。@Neo谢谢!在我将框架迁移到.NETCore3.1并花了整整4个小时试图解决这个问题之后,我错过了类中的ApiController!!