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

양식 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]속성 대신 속성을 사용하십시오 [FromBody].

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

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

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


답변

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

Content-Type: application/json


답변

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

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

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

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

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


답변

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

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


답변

이것은 내 경우입니다 : 실행 환경 : 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>


답변

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;
            });


답변

“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);
          });