web-dev-qa-db-ja.com

ASP.NETコアフォームPOSTの結果、HTTP 415 Unsupported Media Type応答が返されます。

フォームPOST HTTP要求(Content-Type: application/x-www-form-urlencoded)を以下のコントローラに送信すると、HTTP 415 Unsupported Media Type応答が返されます。

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で動作していました。

107
Bart Verkoeijen

フォームの場合は、[FromForm]属性の代わりに[FromBody]属性を使用します。

以下のコントローラはASP.NET Core 1.1で動作します。

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

[FromBody]を使用できますが、リクエストのContent-Typeヘッダーをapplication/jsonに設定する必要があります。

好き

Content-Type: application/json
57
Bjorn Bailleul

良い答えのほかに、あなたはコントローラでフォームデータを取得するために[FromForm]を使う必要はありません。 Frameworkは自動的にフォームデータをモデルに変換します。次のように実装することができます。

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

これは私の場合です:それは実行されている環境:AspNetコア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>
4
Quang Vu

まず、ヘッダーでContent-Typeを指定する必要があります。たとえば、application/jsonにすることができます。

application/jsonコンテンツタイプを設定した場合は、jsonを送信する必要があります。

そのため、リクエストのbodyでは、form-dataではなくx-www-for-urlencodedではなくraw jsonを送信します。たとえば、{"Username": "user", "Password": "pass"}

あなたはあなたが送りたいものを含む様々なコンテンツタイプに例を適応させることができます。

あなたはPostmanやcurlのようなツールを使ってこれをプレイすることができます。

3
gavri