ASP.NET कोर एक HTTP 415 असमर्थित मीडिया प्रकार प्रतिक्रिया में POST परिणाम बनाता है


173

HTTP 415 असमर्थित मीडिया प्रकार प्रतिक्रिया Content-Type: application/x-www-form-urlencodedमें निम्न नियंत्रक परिणामों के लिए एक फॉर्म POST HTTP अनुरोध ( ) भेजना ।

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

यह ASP.NET MVC 5 के साथ .NET 4.6 पर काम करता था।


आपको [FromForm] "सबमिट करें (MyModel मॉडल)" का भी उपयोग करना है, मॉडल को सही ढंग से प्राप्त करें।
हसन

जवाबों:


298

रूपों के लिए, [FromForm]विशेषता के बजाय विशेषता का उपयोग करें [FromBody]

नीचे नियंत्रक ASP.NET कोर 1.1 के साथ काम करता है:

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

नोट: [FromXxx]यदि आपके नियंत्रक के साथ एनोटेट किया गया है तो आवश्यक है [ApiController]। सामान्य दृश्य नियंत्रकों के लिए इसे छोड़ा जा सकता है।


104

आप उपयोग कर सकते हैं [FromBody]लेकिन आपको Content-Typeअपने अनुरोध के शीर्षलेख को application/jsonयानि सेट करने की आवश्यकता है

Content-Type: application/json

1
इसीलिए प्रश्न विशेष रूप से सामग्री-प्रकार के साथ एक फॉर्म POST का उल्लेख करता है application/x-www-form-urlencoded। जैसे <form>HTML पेज पर।
बार्ट वर्कोइजेन सेप

यह मेरे लिए मददगार था, क्योंकि मैं एक फॉर्म सबमिट कर रहा था, न कि फॉर्म। स्वीकृत उत्तर ओपी के लिए सबसे सही है, जो पहले से [FromForm] के लिए सही सामग्री प्रकार का उपयोग कर रहा था। फिर भी, मुझे खुशी है कि यह यहाँ भी था। :)
केन लियोन

1
यह प्रश्न का उत्तर नहीं देता है। प्रश्न यह है कि सर्वर सपोर्ट फॉर्म बॉडी कैसे बनाई जाए, न कि यह कि कैसे अपने सभी क्लाइंट को उन्हें भेजने से रोकें!
सीएसयूवी

रुको, इसका मतलब यह है कि अनुरोध के शरीर से अलग सामग्री को निगलना असंभव है application/json, जैसे application/text? @BartVerkoeijen कोई विचार?
स्प्रिटबैंक

10

पहले आपको हेडर में निर्दिष्ट करने की आवश्यकता है Content-Type, उदाहरण के लिए, यह हो सकता है application/json

यदि आप application/jsonसामग्री प्रकार सेट करते हैं , तो आपको एक संदेश भेजने की आवश्यकता है।

इसलिए, bodyआपके अनुरोध में आप उदाहरण के लिए, नहीं form-data, x-www-for-urlencodedबल्कि एक rawदूत भेज देंगे{"Username": "user", "Password": "pass"}

आप विभिन्न सामग्री प्रकारों के लिए उदाहरण को अनुकूलित कर सकते हैं, जिसमें आप भेजना चाहते हैं।

इससे खेलने के लिए आप पोस्टमैन या कर्ल जैसे टूल का इस्तेमाल कर सकते हैं।


6

अच्छे उत्तरों के अलावा, आपको [FromForm]नियंत्रक में फ़ॉर्म डेटा प्राप्त करने के लिए उपयोग करने की आवश्यकता नहीं है । फ्रेमवर्क स्वचालित रूप से प्रपत्र डेटा को मॉडल में परिवर्तित करता है जैसा आप चाहते हैं। आप निम्नलिखित की तरह लागू कर सकते हैं।

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

3
मैं जो नहीं देखता।
फ्रांस्वा

मैंने इसका परीक्षण किया है और यह काम कर रहा है, आपके कोड के साथ एक और समस्या हो सकती है
हैसन

इससे मेरी समस्या हल हो गई। मैं खेतों और फाइलों के साथ एक फॉर्मडाटा ऑब्जेक्ट को अजाक्सिंग कर रहा था, [FromForm] या [FromBody] ने काम नहीं किया। उन्हें हटा दिया और यह काम कर गया। (Asp.Net MVC Core 2.1 पीछे, वैनिला js सामने)। यहाँ दे दो
डैनियल ज़ैबो

मजेदार, मेरी पिछली टिप्पणी के कुछ महीनों बाद - आज मुझे AspNetCore 2.2 वेब एपी प्रोजेक्ट में एक ही समस्या थी, और मुझे इसे वेबएपीआई नियंत्रक में काम करने के लिए [FromFrom] का उपयोग करना पड़ा (देखें @ बार्ट का जवाब)।
डैनियल स्जाबो

1
मेरे लिए मेरे पास एक [FromQuery]पैरामीटर था, लेकिन मैं सामग्री-प्रकार को निर्दिष्ट नहीं कर रहा था application/json- जैसे कि मेरे अनुरोध में, इस कार्य को [FromQuery] पैरामीटर के साथ भी बनाया।
माइक अपजॉन

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.you की वजह से समस्या का हल हो सकता है

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

विकल्प कहाँ उपलब्ध हैं। कस्टमस्ट्रीमिंगमॉडलबाइंडर () उपलब्ध है ?? मुझे किसी भी स्थान पर इसके दस्तावेज नहीं मिले।
फैब्रिकियो अरुजो

0

"HTTP 415 असमर्थित मीडिया प्रकार की प्रतिक्रिया" आपके अनुरोध के शीर्ष लेख में सामग्री-प्रकार से उपजी है । उदाहरण के लिए अक्षतंतु द्वारा जावास्क्रिप्ट में:

Axios({
            method: 'post',
            headers: { 'Content-Type': 'application/json'},
            url: '/',
            data: data,  // an object u want to send
          }).then(function (response) {
            console.log(response);
          });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.