El envío de un formulario POST solicitud HTTP ( Content-Type: application/x-www-form-urlencoded
) al controlador a continuación da como resultado una respuesta de tipo de medio HTTP 415 no compatible .
public class MyController : Controller
{
[HttpPost]
public async Task<IActionResult> Submit([FromBody] MyModel model)
{
//...
}
}
Encabezados HTTP de publicación de formulario:
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
Esto solía funcionar con ASP.NET MVC 5 en .NET 4.6.
c#
asp.net-core
asp.net-core-mvc
Bart Verkoeijen
fuente
fuente
Respuestas:
Para formularios, use el
[FromForm]
atributo en lugar del[FromBody]
atributo.El siguiente controlador funciona con ASP.NET Core 1.1:
Nota:
[FromXxx]
se requiere si su controlador está anotado con[ApiController]
. Para los controladores de vista normales, se puede omitir.fuente
Puede usar,
[FromBody]
pero debe configurar elContent-Type
encabezado de su solicitudapplication/json
, es decirfuente
application/x-www-form-urlencoded
. Me gusta de a<form>
en una página HTML.application/json
, comoapplication/text
? @BartVerkoeijen alguna idea?Primero debe especificar en los encabezados
Content-Type
, por ejemplo, puede serapplication/json
.Si configura el
application/json
tipo de contenido, debe enviar un json.Entonces, en el caso
body
de su solicitud, no enviaráform-data
,x-www-for-urlencoded
sino unraw
json, por ejemplo{"Username": "user", "Password": "pass"}
Puede adaptar el ejemplo a varios tipos de contenido, incluido lo que desea enviar.
Puedes usar una herramienta como Postman o curl para jugar con esto.
fuente
Además de buenas respuestas, no tiene que usar
[FromForm]
para obtener datos de formulario en el controlador. Framework convierte automáticamente los datos del formulario al modelo que desee. Puede implementar como sigue.fuente
[FromQuery]
parámetro, pero no estaba especificando el Tipo de contenido comoapplication/json
; al agregarlo en mi solicitud, esto también funcionó con el parámetro [FromQuery].Este es mi caso: se ejecuta Entorno: Controlador AspNet Core 2.1:
Ver:
fuente
el problema puede deberse a MVC MW. debe configurar formatterType en las opciones de MVC:
fuente
La "respuesta de tipo de medio HTTP 415 no compatible" se deriva de Content-Type en el encabezado de su solicitud. por ejemplo en javascript por axios:
fuente