无法在ASP.NET Core 2.0中发布原始类型

Rob*_*lls 5 c# asp.net-core

我正在将非常简单的json数据发布到.net Core 2.0 API。

当我有这样的方法时,为什么会这样:

public async Task<IActionResult> GetNewToken([FromBody]string id)
Run Code Online (Sandbox Code Playgroud)

然后id为null,但是如果我将其封装在模型中:

public class RandomViewModel
{
    public string id { get; set; }
}

public async Task<IActionResult> GetNewToken([FromBody]RandomViewModel model)
Run Code Online (Sandbox Code Playgroud)

然后我的ID是否正确填充?

Ham*_*lla 8

实际上,您可以从请求正文中发布基本类型,但不应使用键/值,例如:

public async Task<IActionResult> LockUserByDate(Guid appUserId, [FromBody] string lockoutEnd)
Run Code Online (Sandbox Code Playgroud)

如果我将其用于身体,请在邮递员中对其进行测试时,请考虑以下操作:

{
 "lockoutEnd": "2018-03-15 16:30:35.4766052"
}
Run Code Online (Sandbox Code Playgroud)

然后它不会绑定,但是如果我仅使用主体中的值,则模型绑定器将绑定该值:

"2018-06-15 16:30:35.4766052"
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


has*_*san 4

您无法直接从您的主体获取原始类型,就像([FromBody] string id)您的路由内容类型一样application/json,因为 mvc 等待模型将 json 主体绑定到模型而不是原始类型。

有一些选项可以从请求正文中获取原始类型

  1. 将内容类型更改为纯文本/文本。

  2. 用于StreamReader获取原始令牌字符串。

  3. 使用MVCInputFormatter

StreamReader例子:

[HttpPost]
public async Task<IActionResult> GetNewToken()
{
    using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
    {  
        var token = await reader.ReadToEndAsync(); // returns raw data which is sent in body
    }
    // your code here
}
Run Code Online (Sandbox Code Playgroud)

InputFormatter示例: https: //weblog.west-wind.com/posts/2017/Sep/14/Accepting-Raw-Request-Body-Content-in-ASPNET-Core-API-Controllers