ASP.NET কোর একটি HTTP 415 অসমর্থিত মিডিয়া প্রকার প্রতিক্রিয়াতে POST ফলাফল গঠন করে


173

নীচের নিয়ামককে একটি ফর্ম পোস্ট HTTP অনুরোধ ( Content-Type: application/x-www-form-urlencoded) প্রেরণ করা HTTP 415 অসমর্থিত মিডিয়া প্রকার প্রতিক্রিয়াতে ফলাফল দেয়।

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 এএসপি.নেট এমভিসি 5 এর সাথে কাজ করত।


আপনাকে [ফর্মফর্ম] ব্যবহার করতে হবে না "জমা দিন (মাইমোডেল মডেল) "ও সঠিকভাবে মডেলটি পান।
হাসান

উত্তর:


298

ফর্মগুলির জন্য, [FromForm]গুনটির পরিবর্তে বৈশিষ্ট্যটি ব্যবহার করুন [FromBody]

নীচের নিয়ন্ত্রকটি এএসপি.নেট কোর 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>এইচটিএমএল পৃষ্ঠায় একটি থেকে পছন্দ করুন।
বার্ট ভার্কোইজেন

এটি আমার পক্ষে সহায়ক ছিল, কারণ আমি কোনও ফর্ম নয়, কোনও বিষয় জমা দিয়েছিলাম। গৃহীত উত্তরটি ওপি-র পক্ষে সর্বাধিক সঠিক, যিনি ইতিমধ্যে [ফর্মফর্ম] এর জন্য সঠিক সামগ্রীর ধরণটি ব্যবহার করেছিলেন। তবুও, আমি আনন্দিত যে সে এখানেও ছিল। :)
কেন লিয়ন

1
এটি প্রশ্নের কোনও উত্তর দেয় না। প্রশ্নটি হ'ল সার্ভার সমর্থন ফর্ম সংস্থাগুলি কীভাবে তৈরি করা যায়, কীভাবে আপনার সমস্ত ক্লায়েন্টকে কেবল তাদের পাঠানো বন্ধ করতে বলা যায় না!
csauve

অপেক্ষা করুন, তার মানে কী কোনও অনুরোধের শরীর থেকে application/jsonপছন্দ মতো আলাদা সামগ্রী অন্তর্ভুক্ত করা অসম্ভব application/text? @ বার্টওয়ারকোইজেন কোন ধারণা?
স্পিরিটোজ

10

প্রথমে আপনাকে শিরোনামে নির্দিষ্ট করা দরকার Content-Type, উদাহরণস্বরূপ, এটি হতে পারে application/json

আপনি যদি application/jsonসামগ্রীর প্রকার সেট করে থাকেন তবে আপনাকে জসন প্রেরণ করতে হবে।

সুতরাং bodyআপনার অনুরোধের মধ্যে আপনি উদাহরণস্বরূপ একটি জসন নয় form-data, প্রেরণ করবেনx-www-for-urlencodedraw{"Username": "user", "Password": "pass"}

আপনি যা পাঠাতে চান তা সহ আপনি বিভিন্ন সামগ্রীর ধরণের সাথে উদাহরণটি মানিয়ে নিতে পারেন।

এটির সাথে খেলতে আপনি পোস্টম্যান বা কার্লের মতো একটি সরঞ্জাম ব্যবহার করতে পারেন।


6

ভাল উত্তর ছাড়াও, আপনি [FromForm]নিয়ামক মধ্যে ফর্ম ডেটা পেতে ব্যবহার করতে হবে না। ফ্রেমওয়ার্ক আপনার ইচ্ছামত ফর্ম ডেটাটিকে স্বয়ংক্রিয়ভাবে মডেলে রূপান্তর করে। আপনি নীচের মত বাস্তবায়ন করতে পারেন।

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

3
আমি যা দেখছি তা নয়।
ফ্রান্সোইস

আমি এটি পরীক্ষা করেছি এবং এটি কাজ করে যাচ্ছিল, আপনার কোডের সাথে আর একটি সমস্যা হতে পারে
hasan

এটি আমার সমস্যার সমাধান করেছে। আমি ক্ষেত্র এবং এতে ফাইল যুক্ত একটি ফর্মডেটা অবজেক্টটি অজেক্স করছিলাম, [ফর্মফর্ম] বা [ফ্রমবিডি] কাজ করেনি। তাদের সরানো এবং এটি কাজ করে। (Asp.Net এমভিসি কোর 2.1 পিছনে, ভ্যানিলা জেএস সামনে)। এখানে সংক্ষেপ
ড্যানিয়েল জাজো

মজার কথা, আমার পূর্ববর্তী মন্তব্যের কয়েক মাস পরে - আজ আমার এসপনেটকোর ২.২ ওয়েব এপি প্রকল্পে একই সমস্যা ছিল এবং এটি একটি ওয়েবএপিআই নিয়ামকটিতে কাজ করার জন্য আমাকে [ফ্রম থেকে] ব্যবহার করতে হয়েছিল (@ বার্টের উত্তর দেখুন)।
ড্যানিয়েল জাজো

1
আমার জন্য আমার একটি [FromQuery]প্যারামিটার ছিল , তবে আমি বিষয়বস্তুর application/jsonধরণটি নির্দিষ্ট করে বলছিলাম না - যোগ করে আমার অনুরোধে [ফোরকিউয়ারি] প্যারামিটার দিয়েও এই কাজটি করা হয়েছে।
মাইক উপজহান

5

এটি আমার ক্ষেত্রে: এটি চালিত পরিবেশ: অ্যাস্পনেট কোর 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. আপনার অবশ্যই এমভিসি বিকল্পগুলিতে ফর্ম্যাটর টাইপ সেট করতে হবে:

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

"এইচটিটিপি 415 অসমর্থিত মিডিয়া টাইপ প্রতিক্রিয়া" আপনার অনুরোধের শিরোনামে সামগ্রী-প্রকার থেকে আসে । অক্ষর দ্বারা জাভাস্ক্রিপ্ট উদাহরণস্বরূপ:

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.