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.