.Net Core API - Связывание смешанной модели не работает - PullRequest
1 голос
/ 26 сентября 2019

Используемая платформа - .Net Core 3.0, но протестирована в 2.2 и получила то же поведение.

Я использую класс для автоматического связывания свойств запроса тела, и это работает довольно хорошо,даже без указания атрибута [FromBody].

Теперь я добавил новое свойство в этот класс, которое будет соответствовать свойству из заголовка, и оно будет работать, если я использую его непосредственно в контроллере, например так:

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

Однако, когда я пытаюсь получить тот же результат, добавив атрибут [FromHeader] в свойство класса, он не работает.

Вот пример кода для иллюстрациипроблема:

[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 Ответ

1 голос
/ 26 сентября 2019

Вам необходимо настроить SuppressInferBindingSourcesForParameters как true в ConfigureServices в Startup.cs, как показано ниже:

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

Действие:

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

И вызвать API с помощью Authorizationзаголовок (не показан ниже) и основная строка для почтальона enter image description here

Обновление:

Поскольку вы используете [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; }
}
...