.Net Core API-混合模型绑定不起作用

时间:2019-09-25 23:39:21

标签: c# asp.net asp.net-core .net-core core-api

使用的框架是.Net Core 3.0,但在2.2中进行了测试,并具有相同的行为。

我正在使用一个类来自动绑定正文请求属性,即使没有[FromBody]属性,它也能很好地工作。

现在,我在此类中添加了一个新属性,该属性将与标题中的属性匹配,并且如果直接将其用于控制​​器中,则可以使用该属性,如下所示:

public IActionResult Test(TestRequest request, [FromHeader(Name = "Authorization")] string token)

但是,当我尝试通过将[FromHeader]属性添加到class属性中来获得相同的结果时,它将不起作用。

以下是用于说明此问题的示例代码:

[ApiController]
[Route("api")]
public class TestController : ControllerBase
{
    [HttpPost]
    [Route("Test")]
    public IActionResult Test(TestRequest request)
    {
        Console.WriteLine("request.UserId: " + request.UserId);
        Console.WriteLine("request.Token: " + request.Token);
        return Ok();
    }
}
public class TestRequest
{
    [FromBody]
    public string UserId { get; set; }

    [FromHeader(Name = "Authorization")]
    public string Token { get; set; }
}

有人遇到过同样的问题吗?

1 个答案:

答案 0 :(得分:1)

您需要在Startup.cs的ConfigureServices中将SuppressInferBindingSourcesForParameters配置为true,如下所示:

services.AddMvc().ConfigureApiBehaviorOptions(options =>
        {
            options.SuppressInferBindingSourcesForParameters = true;
        });

操作:

[HttpPost]
[Route("Test")]
public IActionResult Test(TestRequest request)

并使用您的Authorization标头(未在下面显示)和正文字符串调用api,以供邮递员使用 enter image description here

更新

由于您在string属性上使用了[FromBody],因此它接受的是字符串而不是json对象。

如果您仍想将json对象作为{ "userId" : "123" }传递,则可以将userId扭曲到模型中,例如:

public class User
{
    public string UserId { get; set; }
}
public class TestRequest
{
    [FromBody]
    public User User { get; set; }

    [FromHeader(Name = "Authorization")]
    public string Token { get; set; }
}