Почему [FromBody] необходим для сложных типов в некоторых случаях?

Я начал новый пустой проект ASP.NET Core 3.1. Я обновил Startup.cs до этого:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment()) app.UseDeveloperExceptionPage();
        app.UseRouting();
        app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
    }
}

и добавил немного тестовой логики:

public class SomeDto
{
    public string Message { get; set; }
}

[Route("/api/v1/foo")]
public class FooController : ControllerBase
{
    [HttpPost]
    public ActionResult<SomeDto> Echo(SomeDto dto)
    {
        dto.Message += " echoooo...";
        return dto;
    }
}

Теперь я ожидал бы такого звонка:

curl -d '{"message":"hi"}' -H 'Content-Type: application/json' https://localhost:44351/api/v1/foo -k

вернуть {"message": "hi echoooo..."}. Вместо этого аргумент метода Echo всегда является объектом new без каких-либо Message.

Если я присвою аргументу [FromBody], он сработает.

Все мои поиски приводят к похожему, но другому вопросу, который объясняет, что [FromBody] необходим, если аргумент является простым типом и не нужен, если это сложный тип. поиск в Google, по-видимому, приводит к аналогичной информации.

Но в моем случае аргумент является сложным типом (dto). Так почему это не работает без атрибута?


РЕДАКТИРОВАТЬ: дублирующий вопрос правильно сообщите нам, что вам нужно [ApiController] выше вашего класса FooController, чтобы включить поведение по умолчанию для чтения данных тела сообщения.


person Jeroen    schedule 15.03.2020    source источник
comment
Этот пост ответил на ваш вопрос? stackoverflow.com/questions/50771647 /   -  person Orel Eraki    schedule 15.03.2020
comment
Кажется, вы ищете старый ASP.NET, для ASP.NET Core все изменилось, FromBody требуется для сложных типов. Взгляните, например, на эту статью, или проверьте документы   -  person Pavel Anikhouski    schedule 15.03.2020
comment
Да @OrelEraki, это почти дубликат. Не знал, что [ApiController] нужен в дополнение к наследованию от ControllerBase, чтобы получить то поведение, которое мне нужно. Благодарю вас!   -  person Jeroen    schedule 15.03.2020