ASP.NET 코어 양식 POST로 인해 HTTP 415 지원되지 않는 미디어 유형 응답


173

양식 POST HTTP 요청 ( Content-Type: application/x-www-form-urlencoded)을 아래 제어기로 보내면 HTTP 415 지원되지 않는 매체 유형 응답이 발생합니다.

public class MyController : Controller
{
    [HttpPost]
    public async Task<IActionResult> Submit([FromBody] MyModel model)
    {
        //...
    }
}

양식 게시물 HTTP 헤더 :

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

이것은 .NET 4.6에서 ASP.NET MVC 5와 작동하는 데 사용되었습니다.


[FromForm]을 사용하지 않아도됩니다. "Submit (MyModel model)"도 모델을 올바르게 가져옵니다.
hasan

답변:


298

양식의 경우 [FromForm]속성 대신 속성을 사용하십시오 [FromBody].

아래 컨트롤러는 ASP.NET Core 1.1에서 작동합니다.

public class MyController : Controller
{
    [HttpPost]
    public async Task<IActionResult> Submit([FromForm] MyModel model)
    {
        //...
    }
}

참고 : [FromXxx]컨트롤러에 주석이있는 경우 필수입니다 [ApiController]. 일반 뷰 컨트롤러의 경우 생략 할 수 있습니다.


104

당신은 사용할 수 [FromBody]있지만 설정해야합니다 Content-Type귀하의 요청 헤더를 application/json, 즉,

Content-Type: application/json

1
그렇기 때문에 질문에 구체적 으로 content-type과 함께 POST 형식이 언급 application/x-www-form-urlencoded됩니다. <form>HTML 페이지 에서처럼 .
Bart Verkoeijen

이것은 양식이 아닌 객체를 제출했기 때문에 나에게 도움이되었습니다. 허용 된 답변은 이미 [FromForm]에 올바른 컨텐츠 유형을 사용하고있는 OP에 대해 가장 정확합니다. 아직도, 나는 이것도 여기있어서 기쁘다. :)
Ken Lyon

1
이것은 질문에 전혀 대답하지 않습니다. 질문은 서버 지원 양식 본문을 만드는 방법이며 모든 클라이언트에게 전송을 중지하도록 지시하는 방법이 아닙니다!
csauve

잠깐, 그것은 요청 본문 application/json에서와 다른 콘텐츠를 입수하는 것이 불가능하다는 것을 의미 application/text합니까? @BartVerkoeijen 어떤 아이디어가 있습니까?
SpiritBob

10

먼저 헤더에을 지정해야합니다 ( Content-Type예 :) application/json.

application/json컨텐츠 유형 을 설정 하면 json을 보내야합니다.

그래서에서 body요청의 당신은하지 보내드립니다 form-data아니라 x-www-for-urlencoded하지만, raw예를 들어, JSON{"Username": "user", "Password": "pass"}

보내려는 내용을 포함하여 다양한 컨텐츠 유형에 예제를 적용 할 수 있습니다.

Postman 또는 curl과 같은 도구를 사용하여이를 사용할 수 있습니다.


6

좋은 답변 외에도 [FromForm]컨트롤러에서 양식 데이터를 얻는 데 사용할 필요는 없습니다 . 프레임 워크는 원하는대로 양식 데이터를 모델로 자동 변환합니다. 다음과 같이 구현할 수 있습니다.

[HttpPost]
public async Task<IActionResult> Submit(MyModel model)
{
    //...
}

3
내가 아는 것은 아닙니다.
François

나는 그것을 테스트했고 작동했다. 코드에 또 다른 문제가있을 수있다
hasan

이것은 내 문제를 해결했습니다. [FromForm] 또는 [FromBody]가 작동하지 않는 필드와 파일이있는 FormData 객체를 아약스 처리했습니다. 그것들을 제거하고 효과가있었습니다. (Asp.Net MVC Core 2.1 후면, 바닐라 js 전면). 여기에 요점 .
Daniel Szabo

재미있게, 이전 의견 수개월 후-오늘 AspNetCore 2.2 Web Api 프로젝트에서 동일한 문제가 발생했으며 WebFrom 컨트롤러에서 작동하도록 [FromFrom]을 사용해야했습니다 (@Bart의 답변 참조).
Daniel Szabo

1
나에게 [FromQuery]매개 변수가 있었지만 Content-Type을 지정하지 않았습니다. application/json요청에 추가하면 [FromQuery] 매개 변수로도 작동합니다.
Mike Upjohn

5

이것은 내 경우입니다 : 실행 환경 : AspNet Core 2.1 컨트롤러 :

public class MyController
{
    // ...

    [HttpPost]
    public ViewResult Search([FromForm]MySearchModel searchModel)
    {
        // ...
        return View("Index", viewmodel);
    }
}

전망:

<form method="post" asp-controller="MyController" asp-action="Search">
    <input name="MySearchModelProperty" id="MySearchModelProperty" />
    <input type="submit" value="Search" />
</form>

2

MVC MW로 인해 문제가 발생할 수 있습니다. MVC 옵션에서 formatterType을 설정해야합니다.

services.AddMvc(options =>
            {
                options.UseCustomStringModelBinder();
                options.AllowEmptyInputInBodyModelBinding = true;
                foreach (var formatter in options.InputFormatters)
                {
                    if (formatter.GetType() == typeof(SystemTextJsonInputFormatter))
                        ((SystemTextJsonInputFormatter)formatter).SupportedMediaTypes.Add(
                            Microsoft.Net.Http.Headers.MediaTypeHeaderValue.Parse("text/plain"));
                }
            }).AddJsonOptions(options =>
            {
                options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
            });

options.UseCustomStringModelBinder ()를 사용할 수있는 곳 ?? 어느 곳에서도 문서를 찾을 수 없습니다.
Fabricio Araujo

0

"HTTP 415 지원되지 않는 미디어 유형 응답"은 요청 헤더의 Content-Type 에서 비롯됩니다 . 예를 들어 axios의 자바 스크립트에서 :

Axios({
            method: 'post',
            headers: { 'Content-Type': 'application/json'},
            url: '/',
            data: data,  // an object u want to send
          }).then(function (response) {
            console.log(response);
          });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.