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 已启用

ASP.NET Core API POST 参数始终为空

使用 .NET 6 在 ASP.NET Core 中处理 API 调用中的空子类

ASP.Net Core 3.1 - Web API 中的 Post 参数始终为 NULL

ASP.NET Core Web API HTTP POST 在 Azure 中返回 404

以 axios.post 形式接收 asp.net core web api 中的数组