У меня есть проект webapi для ядра (v2.1) asp.net, который предоставляет эту функцию:
[HttpPost]
[Route("v1/do-something")]
public async Task<IActionResult> PostDoSomething(ModelData model)
{
//...
}
и эта модель:
public class ModelData
{
[Required]
public string Email { get; set; }
}
Я хочу сделать эту конечную точку гибкой с точки зрения типа контента. Следовательно, все в порядке, чтобы отправлять этот тип содержимого конечной точки в теле.
Например, будет разрешен аргумент "BODY":
// application/x-www-form-urlencoded
email="abc123@gmail.com"
// application/json
{
"email": "abc123@gmail.com"
}
В отличие от старого .net framework, в ядре dotnet это не разрешено из коробки. Я обнаружил, что мне нужно добавить атрибут Consume
с атрибутом [FormForm]
. Но если я добавлю атрибут [FormForm]
в аргумент модели, он больше не будет работать в JSON (например) - потому что тогда он должен быть [FromBody]
.
Я думаю, что будет нормально использовать код, подобный этому:
[HttpPost]
[Route("v1/do-something")]
public async Task<IActionResult> PostDoSomething([FromBody] [FromForm] ModelData model)
{
//...
}
Но, как вы можете ожидать, этот код не работает.
Итак, чтобы достичь этой гибкости, мне нужно продублировать все мои конечные точки - что звучит как очень-очень плохая идея.
[HttpPost]
[Route("v1/do-something")]
[Consume ("application/json")]
public async Task<IActionResult> PostDoSomething([FromBody] ModelData model)
{
//...
}
[HttpPost]
[Route("v1/do-something")]
[Consume ("application/x-www-form-urlencoded")]
public async Task<IActionResult> PostDoSomething([FromForm] ModelData model)
{
//...
}
// ... Other content types here ...
Звучит легко. Но кажется более сложным.
Я что-то пропустил? Как заставить конечную точку работать с любым типом контента?