Enviar um formulário POST HTTP request ( Content-Type: application/x-www-form-urlencoded
) para o controlador abaixo resulta em uma resposta HTTP 415 Tipo de mídia não suportado .
public class MyController : Controller
{
[HttpPost]
public async Task<IActionResult> Submit([FromBody] MyModel model)
{
//...
}
}
Cabeçalhos HTTP de postagem de formulário:
POST /submit HTTP/1.1
Host: example.com:1337
Connection: keep-alive
Content-Length: 219
Pragma: no-cache
Cache-Control: no-cache
Origin: https://example.com:1337
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://example.com:1337/submit
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8,nl;q=0.6
Isso costumava funcionar com o ASP.NET MVC 5 no .NET 4.6.
c#
asp.net-core
asp.net-core-mvc
Bart Verkoeijen
fonte
fonte
Respostas:
Para formulários, use o
[FromForm]
atributo em vez do[FromBody]
atributo.O controlador abaixo funciona com o ASP.NET Core 1.1:
Nota:
[FromXxx]
é necessário se o seu controlador estiver anotado[ApiController]
. Para controladores de exibição normal, isso pode ser omitido.fonte
Você pode usar,
[FromBody]
mas precisa definir oContent-Type
cabeçalho da sua solicitação comoapplication/json
, por exemplo ,fonte
application/x-www-form-urlencoded
. Como<form>
em uma página HTML.application/json
, comoapplication/text
? @BartVerkoeijen alguma idéia?Primeiro você precisa especificar nos cabeçalhos
Content-Type
, por exemplo, pode serapplication/json
.Se você definir o
application/json
tipo de conteúdo, precisará enviar um json.Portanto, no
body
seu pedido, você não enviaráform-data
,x-www-for-urlencoded
mas não umraw
json, por exemplo{"Username": "user", "Password": "pass"}
Você pode adaptar o exemplo a vários tipos de conteúdo, incluindo o que deseja enviar.
Você pode usar uma ferramenta como Postman ou curl para brincar com isso.
fonte
Como adição de boas respostas, você não precisa usar
[FromForm]
para obter dados do formulário no controlador. O Framework converte automaticamente os dados do formulário em modelo como desejar. Você pode implementar como a seguir.fonte
[FromQuery]
parâmetro, mas não estava especificando o Tipo de Conteúdo comoapplication/json
- acrescentando que na minha solicitação, também fiz esse trabalho com o parâmetro [FromQuery].Este é o meu caso: ele é executado. Ambiente: AspNet Core 2.1 Controller:
Visão:
fonte
o problema pode ocorrer devido ao MVC MW. você deve definir formatterType nas opções do MVC:
fonte
"Resposta do tipo de mídia HTTP 415 não suportada" decorre do Tipo de conteúdo no cabeçalho da sua solicitação. por exemplo em javascript por axios:
fonte