ASP.NET CoreフォームのPOSTでHTTP 415 Unsupported Media Type応答が発生する


173

Content-Type: application/x-www-form-urlencoded以下のコントローラーにフォームPOST HTTPリクエスト()を送信すると、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で機能していました。


[FromForm] "Submit(MyModel model)"を使用する必要はありません。モデルも正しく取得されます。
ハサン

回答:


298

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

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

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

注:[FromXxx]コントローラにで注釈が付けられている場合は必須です[ApiController]。通常のView Controllerの場合は省略できます。


104

あなたは使用することができます[FromBody]が、あなたは設定する必要がありますContent-Typeへのリクエストのヘッダーをapplication/json、すなわち

Content-Type: application/json

1
そのため、質問ではcontent-typeを含むフォーム POST について具体的に言及していますapplication/x-www-form-urlencoded。以下からのような<form>HTMLページで。
Bart Verkoeijen 2017

フォームではなくオブジェクトを送信していたので、これは役に立ちました。受け入れられた答えは、[FromForm]の正しいコンテンツタイプをすでに使用していたOPに最も適切です。それでも、これがここにあったのはうれしいです。:)
ケン・リヨン

1
これは質問にまったく答えません。問題は、サーバーサポートフォームの本文を作成する方法であり、すべてのクライアントに送信を停止するように伝えるだけではありません。
csauve 2018

待って、それは平均よりリクエストの体の異なるからコンテンツを摂取することは不可能だというん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
私が見るものではありません。
フランソワ

あなたのコードで別の問題があることができ、私はそれをテストして、それが働いていた
ハサン・

これは私の問題を解決しました。フィールドとファイルが含まれているFormDataオブジェクトをAjaxで処理していましたが、[FromForm]または[FromBody]が機能しませんでした。それらを削除し、それは働いた。(Asp.Net MVC Core 2.1バック、バニラjsフロント)。 ここの要点
Daniel Szabo

おかしい、前回のコメントから数か月後-今日、AspNetCore 2.2 Web Apiプロジェクトでも同じ問題があり、[FromFrom]を使用してWebAPIコントローラーで機能させる必要がありました(@Bartの回答を参照)。
Daniel Szabo

1
私には[FromQuery]パラメーターがありましたが、Content-Typeをasとして指定していませんでした。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 Unsupported Media Type response」は、リクエストのヘッダーのContent-Typeに由来します。たとえば、axiosによるJavaScriptの場合:

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.