ASP.NET Core form POST, HTTP 415 Desteklenmeyen Ortam Türü yanıtıyla sonuçlanır


173

Content-Type: application/x-www-form-urlencodedAşağıdaki denetleyiciye bir form POST HTTP isteği ( ) göndermek, HTTP 415 Desteklenmeyen Ortam Türü yanıtına neden olur.

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

Form sonrası HTTP üstbilgileri:

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

Bu, .NET 4.6'da ASP.NET MVC 5 ile çalışırdı.


[FromForm] "Gönder (MyModel modeli)" kullanmak zorunda değilsiniz de modeli doğru olsun.
— hasan

Yanıtlar:


298

Formlar için, [FromForm]nitelik yerine niteliği kullanın [FromBody].

Aşağıdaki denetleyici ASP.NET Core 1.1 ile çalışır:

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

Not: [FromXxx]kontrolörünüze açıklama eklenmişse gereklidir [ApiController]. Normal görüntü denetleyicileri için atlanabilir.


104

Sen kullanabilirsiniz [FromBody]ancak ayarlamış getirmemiz yeterlidir Content-Typeiçin istek başlığını application/json, yani

Content-Type: application/json

1
Bu yüzden soru özellikle içerik türünde bir POST formundan bahsediyor application/x-www-form-urlencoded. Bir dan gibi <form>bir HTML sayfası üzerinde.
— Bart Verkoeijen

Bu benim için yardımcı oldu, çünkü bir form değil, bir nesne gönderiyordum. Kabul edilen cevap, [FromForm] için doğru içerik türünü zaten kullanan OP için en doğrudur. Yine de, bunun da burada olduğuna sevindim. :)
— Ken Lyon

1
Bu soruya hiç cevap vermiyor. Soru, tüm istemcilerinizi göndermeyi bırakmasını nasıl söyleyeceğinizi değil, sunucu destek form gövdelerinin nasıl yapılacağıdır!
— csauve

Bekle, bu, bir isteğin gövdesinden farklı bir şekilde içerik almanın imkansız olduğu anlamına mı application/jsongeliyor application/text? @BartVerkoeijen herhangi bir fikir?
— SpiritBob

10

İlk olarak, Başlıklarda belirtmeniz gerekir Content-Type, örneğin, olabilir application/json.

application/jsonİçerik türünü ayarlarsanız , bir json göndermeniz gerekir.

Yani bodyisteğinizde örneğin bir json değil form-data, göndereceksinizx-www-for-urlencodedraw{"Username": "user", "Password": "pass"}

Örneği göndermek istediğiniz içerik de dahil olmak üzere çeşitli içerik türlerine uyarlayabilirsiniz.

Bununla oynamak için Postacı veya kıvırmak gibi bir araç kullanabilirsiniz.


6

İyi yanıtların yanı sıra, [FromForm]form verilerini denetleyicide almak için kullanmanız gerekmez . Framework, form verilerini istediğiniz gibi otomatik olarak modele dönüştürür. Aşağıdaki gibi uygulayabilirsiniz.

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

3
Gördüğüm gibi değil.
— François

Test ettim ve çalışıyordu,
— hasan

Bu benim sorunumu çözdü. FormData nesnesini alanları ve dosyaları ile ajaxing, [FromForm] veya [FromBody] işe yaramadı. Onları çıkardı ve işe yaradı. (Asp.Net MVC Core 2.1 arka, vanilya js ön). Buraya Gist .
— Daniel Szabo

Komik, önceki yorumumdan birkaç ay sonra - bugün AspNetCore 2.2 Web Api projesinde aynı sorunu yaşadım ve bir WebAPI kontrol cihazında çalışmasını sağlamak için [FromFrom] 'u kullanmak zorunda kaldım (bakınız @ Bart'ın cevabı).
— Daniel Szabo

1
Benim için bir [FromQuery]parametre vardı , ama Content-Type olarak belirtmek değildi application/json- benim istek ekleyerek, bu [FromQuery] parametresi ile de yaptı.
— Mike Upjohn

5

Bu benim durumum: çalıştırılıyor Ortam: AspNet Core 2.1 Denetleyici:

public class MyController
{
    // ...

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

Görünüm:

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

2

sorun MVC MW nedeniyle olabilir. MVC seçeneklerinde formatterType ayarlamanız gerekir:

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

Seçenekler burada UseCustomStringModelBinder () kullanılabilir ?? Belgelerini hiçbir yerde bulamadım.
— Fabricio Araujo

0

"HTTP 415 Desteklenmeyen Medya Türü yanıtı" , isteğinizin başlığındaki İçerik Türü'nden kaynaklanıyor . örneğin axios tarafından javascript'te:

Axios({
            method: 'post',
            headers: { 'Content-Type': 'application/json'},
            url: '/',
            data: data,  // an object u want to send
          }).then(function (response) {
            console.log(response);
          });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.