While working with ASP.NET Core, I find that the [ApiController] attribute does a lot of magic to my controller.
https://docs.microsoft.com/en-us/aspnet/core/web-api/?view=aspnetcore-3.1#apicontroller-attribute
It will automatically throws 400 bad request error back to the client, parse the service model from the request payload, and a bunch of other things.
I’m still not sure how model binding works without this attribute, maybe I would have to decorate the service with binding attributes for it to work.