Asp.net Core 2 API POST 对象为空?
Posted
技术标签:
【中文标题】Asp.net Core 2 API POST 对象为空?【英文标题】:Asp.net Core 2 API POST Objects are NULL? 【发布时间】:2017-08-24 13:06:42 【问题描述】:我有一个带有一些测试功能的 .net Core 2 API 设置。 (Visual Studio 2017)
使用邮递员我将原始数据发布到该方法,但模型只是空白?为什么?
// 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;
【问题讨论】:
【参考方案1】:您需要在模型中包含[FromBody
] 属性:
[FromBody] MyTestModel model
请参阅 Andrew Lock 的post 了解更多信息:
为了在 ASP.NET Core 中正确绑定 JSON,您必须修改您的操作以在参数中包含属性
[FromBody]
。这告诉框架使用请求的内容类型标头来决定使用哪个已配置的 IInputFormatter 来进行模型绑定。
正如 @anserk 在 cmets 中所指出的,这也需要将 Content-Type
标头设置为 application/json
。
【讨论】:
他还需要在请求中设置正确的内容类型。它应该是application/json
而不是text
。
将ApiController
属性添加到类也可以,然后您就不需要在参数中包含FromBody
。
@Neo 谢谢!在我将框架迁移到 .net core 3.1 并花了 4 个小时试图解决这个问题后,我的课程中缺少 ApiController!【参考方案2】:
要为已接受的答案添加更多信息:
在不使用属性的情况下自动绑定参数的三个来源:
表单值:这些是在 HTTP 请求中使用的表单值 POST 方法。 (包括 jQuery POST 请求)。
Route values:路由提供的一组路由值
查询字符串:URI 的查询字符串部分。
请注意,Body
不是其中之一(尽管我认为应该是)。
因此,如果您有需要从主体绑定的值,则必须使用属性绑定属性。
昨天这让我大吃一惊,因为我认为 Body 中的参数会自动绑定。
第二个小点是Body只能绑定一个参数。
每个用 [FromBody] 修饰的动作最多可以有一个参数。 ASP.NET Core MVC 运行时将读取请求流的责任委托给格式化程序。一旦为某个参数读取请求流,通常就无法再次读取请求流以绑定其他 [FromBody] 参数。
因此,如果您需要多个参数,则需要创建一个模型类来绑定它们:
public class InputModel
public string FirstNameget;set;
public string LastNameget;set;
[HttpPost]
public IActionResult test([FromBody]InputModel model)...
The Docs
【讨论】:
【参考方案3】:我处理这个问题几个小时。这个问题源于几个原因。假设请求是 Reactjs (javascript),后端 (API) 是 Asp .Net Core。
在请求中,必须在header中设置Content-Type:
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.在 Startup --> ConfigureServices:
#region Allow-Orgin
services.AddCors(c =>
c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin());
);
#endregion
2。在 Startup --> Configure before app.UseMvc() :
app.UseCors(builder => builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
3.在控制器中操作之前:
[EnableCors("AllowOrigin")]
【讨论】:
【参考方案4】:就我而言,我有 get;放; 在我的 .cs 模型中丢失,这导致在 POST 上所有成员都为 null 的对象。
【讨论】:
【参考方案5】:或者,将[ApiController]
属性添加到您的控制器。
这多次(相隔数月)对我造成了恼人的影响,我希望这个答案可见。
【讨论】:
以上是关于Asp.net Core 2 API POST 对象为空?的主要内容,如果未能解决你的问题,请参考以下文章
本地 Javascript Fetch Post 请求失败,调用 ASP.NET Core 2.2 Web API。 CORS 已启用
使用 .NET 6 在 ASP.NET Core 中处理 API 调用中的空子类
ASP.Net Core 3.1 - Web API 中的 Post 参数始终为 NULL