Я начал новый пустой проект 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
, чтобы включить поведение по умолчанию для чтения данных тела сообщения.
FromBody
требуется для сложных типов. Взгляните, например, на эту статью, или проверьте документы - person Pavel Anikhouski   schedule 15.03.2020[ApiController]
нужен в дополнение к наследованию отControllerBase
, чтобы получить то поведение, которое мне нужно. Благодарю вас! - person Jeroen   schedule 15.03.2020