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.