পোস্ট প্যারামিটার সর্বদা নাল


197

ওয়েবএপিআইয়ের জন্য আরসিতে আপগ্রেড করার পরে আমার ওয়েবএপিআইতে পোষ্ট কল করার সময় আমার কাছে কিছু বাস্তব সমস্যা দেখা দিচ্ছে। এমনকি আমি নতুন প্রকল্পে উত্পন্ন বেসিক সংস্করণে ফিরে গিয়েছি। তাই:

public void Post(string value)
{
}

এবং ফিডলারের কাছ থেকে কল:

Header:
User-Agent: Fiddler
Host: localhost:60725
Content-Type: application/json
Content-Length: 29

Body:
{
    "value": "test"
}

আমি যখন ডিবাগ করি তখন স্ট্রিং "মান" কখনই বরাদ্দ করা হয় না। এটা ঠিক সবসময় নাল। কেউ এই সমস্যা আছে?

(আমি প্রথমটি আরও জটিল ধরণের দিয়ে দেখেছি)

সমস্যাটি কেবল এএসপি.নেট এমভিসি 4-তে আবদ্ধ নয়, আরসি ইনস্টলেশনের পরে একটি নতুন এএসপি.নেট এমভিসি 3 প্রকল্পের ক্ষেত্রেও একই সমস্যা দেখা দেয়


কেবল সমস্যা যুক্ত করতে - এটি জেএসএনের সাথে একচেটিয়া নয়, এটি এক্সএমএল দিয়েও ঘটে happens
ianrathbone

3
আমি এটি নিয়ে দু'দিন ব্যাটিং করে যাচ্ছি এবং প্রতিটি নিবন্ধটি সম্পর্কে এটির সন্ধানের পরে, এটি ওয়েবআরকুয়েসে সঠিকভাবে জেএসএন স্ট্রিংটি ফর্ম্যাট করার মতো সহজ বলে প্রমাণিত হয়েছিল: ডাবল উদ্ধৃতি দিয়ে ডেটা শুরু হওয়া উচিত এবং শেষ হওয়া উচিত যদি আপনি আপনার জসন ডেটা জুড়ে একক উদ্ধৃতি ব্যবহার করুন এটি সমস্ত দুর্দান্ত দেখাচ্ছে।
জিনার

উত্তর:


101

যেহেতু আপনার কেবলমাত্র একটি প্যারামিটার রয়েছে তাই আপনি এটিকে [FromBody]অ্যাট্রিবিউট দিয়ে সাজানোর চেষ্টা করতে পারেন , বা একটি ডিটিও সম্পত্তি হিসাবে মান হিসাবে গ্রহণ করার পদ্ধতিটি পরিবর্তন করতে পারেন, যেমনটি আমি এখানে বলেছি: এমভিসি 4 আরসি ওয়েবএপি প্যারামিটার বাইন্ডিং

আপডেট: অফিসিয়াল এএসপি.এনইটি সাইটটি একটি দুর্দান্ত ব্যাখ্যার সাথে আজ আপডেট করা হয়েছিল: https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part- 1

সংক্ষেপে, দেহে কোনও একক সরল প্রকার প্রেরণ করার সময়, একটি সমান চিহ্ন (=) সহ উপস্থাপিত মানটি প্রেরণ করুন, যেমন শরীর:

=test


9
আমি [ফ্রমবডি] ঘূর্ণি দিয়েছিলাম তবে এর কোনও পরিবর্তন হয়নি
আয়ানরাথবোন


8
=জিমের পরামর্শটি (জেএসওএন অবজেক্ট হিসাবে নয়) জেনে তার পরামর্শ অনুসরণ না করা অবধি সামনের সংযোজনটি কখনই আমার পক্ষে কাজ করে নি। এটি কী! আমি সত্যিই পছন্দসই ওয়েবএপিআই পছন্দ করি না।
gitsitgo

16
এটি এত নির্বোধ এবং বিরক্তিকর যে আমি জানি না যে উত্তরটি আমার সমস্যার সমাধান করতে সহায়তা করেছে এমন উত্তরকে উঁচু করে তুলতে হবে বা নামিয়ে আনতে হবে ... পৃথিবীতে কেন এই বিন্যাসে থাকতে হবে? (মনোভাবের জন্য দুঃখিত, এটিতে খুব বেশি সময় নষ্ট করা এবং এটি কোনও অর্থ দেয় না ... :()। লোকেরা এটি যেভাবে গ্রহণ করবে আশা করে সেই ফর্ম্যাটটির জন্য আপনার সমর্থন যুক্ত করা উচিত।
জিডোরন 18:15

6
ধন্যবাদ! পৃথিবীতে কীভাবে আমাদের জানা উচিত যে কেবলমাত্র একটি প্যারামিটার পাঠানোর সময় আমাদের প্যারামিটারের নামটি সরিয়ে ফেলতে হবে? কোন পাখিগ্রাহীণ এই ধারণাটি নিয়ে এসেছিলেন?
জেনি ও'রিলি

104

আমি আজ এই উপর আমার মাথা আঁচড়ান।

আমার সমাধান পরিবর্তন হয় [FromBody]একটি থেকে HttpRequestMessageমূলত HTTP- র স্ট্যাকের আপ চলন্ত।

আমার ক্ষেত্রে আমি তারের জুড়ে ডেটা প্রেরণ করছি যা জিপড জেসন যা পরে বেস 64 d একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন থেকে এই সব।

আমার ওয়েব শেষ পয়েন্টের আসল স্বাক্ষরটি (ব্যবহার করে [FromBody]) এর মতো দেখায় :

আমার আসল পয়েন্ট

এই ইস্যুটির HttpRequestMessageজন্য আমার স্থিরতাটি আমার শেষ বিন্দুর স্বাক্ষরের জন্য একটি ব্যবহারে ফিরে যাওয়া ছিল ।

এখানে চিত্র বর্ণনা লিখুন

তারপরে আপনি কোডের এই লাইনটি ব্যবহার করে পোস্ট ডেটাতে অ্যাক্সেস পেতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

এটি কাজ করে এবং আপনাকে কাঁচা অচ্ছুত পোস্ট ডেটাতে অ্যাক্সেসের অনুমতি দেয়। আপনার স্ট্রিংয়ের শুরুতে ফিডলারের সাথে একটি = চিহ্ন রেখে বা বিষয়বস্তুর ধরণ পরিবর্তন করার দরকার নেই।

অন্যদিকে, আমি প্রথমে উপরের যে কোনও একটি উত্তর অনুসরণ করার চেষ্টা করেছি যা বিষয়বস্তুর ধরণটি পরিবর্তিত করতে হয়েছিল: "বিষয়বস্তুর ধরণ: অ্যাপ্লিকেশন / x-www-form-urlencoded"। কাঁচা ডেটার জন্য এটি খারাপ পরামর্শ কারণ এটি + অক্ষরগুলি সরিয়ে দেয়।

সুতরাং একটি বেস 64 স্ট্রিং যা এর মতো শুরু হয়: "এমকিউএএএবি + এলসিএএএএএএ" এই "এমকিউএএএবি এলসিএএএএএএএ" এর মত শেষ হয়! আপনি যা চান তা নয়

ব্যবহারের আর একটি সুবিধা HttpRequestMessageহ'ল আপনি আপনার শেষ পয়েন্টের মধ্যে থেকে সমস্ত http শিরোনামের অ্যাক্সেস পান।


6
চমৎকার সমাধান ... আমাকে 9 ঘন্টা নেন এই এটি আউট পর আমি [FromBody] স্ট্রিং মান মুছে আমার সমস্যা সাজানো এবং HttpRequestMessage সঙ্গে এটি প্রতিস্থাপিত
Kev

1
একটি যাদুমন্ত্র মত কাজ করে! তবে কোনও নির্দিষ্ট অবজেক্টের প্রকৃত প্যারামিটার ধরণের ব্যবহার করার উপায় নেই? যেমন, ওয়েব এপিআই পদ্ধতির জন্য অর্ডার টাইপের প্যারামিটার?
রন নুনি

7
কেবলমাত্র একটি পার্শ্ব নোট, আপনার HttpRequestMessage requestকাছে পদ্ধতিটির স্বাক্ষর প্রয়োজন নেই, যেমন আপনার কাছে ইতিমধ্যে এটি ইতিমধ্যে রয়েছে। পদ্ধতির শরীরে এটি Requestঅবজেক্টে অ্যাক্সেস করা যায় । যেমনRequest.Content.ReadAsStringAsync().Result;
মরভেল

আপনার JSON অবজেক্টটি ভুল হওয়ায় সাধারণত এই সমস্যা হয়। আমি এটি সর্বদা খুঁজে পেয়েছি কারণ কনস্ট্রাক্টরটিতে একটি অবৈধ প্রকার রয়েছে এবং জসন কীভাবে এটি 'স্ট্রিং-এ গাইড'কে রূপান্তর করতে জানেন না। সুতরাং হয় সেটিংসের মাধ্যমে রূপান্তরকারী যুক্ত করুন বা একটি ফাঁকা নির্মাতা যুক্ত করুন এবং আপনার আর পুরানো কোডটিতে ফিরে আসার দরকার নেই।
নিক টার্নার

সবচেয়ে সহজ উপায় হ'ল অবজেক্টটিকে স্ট্রিংয়ে স্যুইচ করা এবং তারপরে চেষ্টা করে রূপান্তর করুন এবং আপনি JSON ত্রুটি দেখতে পাবেন। আপনি শিরোনামও পরীক্ষা করে দেখুন।
নিক টার্নার

71

আমি সবেমাত্র ফিডলারের সাহায্যে এটি পেয়েছি। সমস্যাটি ছিল যে আমি নির্দিষ্ট করেছিলাম না Content-Type

Content-Typeআপনার পোষ্ট অনুরোধের জন্য একটি শিরোনাম অন্তর্ভুক্ত করার চেষ্টা করুন ।

Content-Type: application/x-www-form-urlencoded

বিকল্পভাবে, নীচের মতামত অনুসারে, আপনাকে জেএসওএন শিরোনাম অন্তর্ভুক্ত করতে হতে পারে

Content-Type: application/json

11
আমার একই ধরণের সমস্যা ছিল, ব্যতীত আমার কন্টেন্ট-টাইপ: অ্যাপ্লিকেশন /
জেসন

2
পোস্টটিতে উল্লিখিত হিসাবে - আমি ইতিমধ্যে সামগ্রী-প্রকার: অ্যাপ্লিকেশন /
জেসন

2
অ্যাপ্লিকেশন / x-www-form-urlencoded আমার জন্য কাজ করে না, বিষয়বস্তুর ধরণ: অ্যাপ্লিকেশন / json করেছে।
লিয়াং

1
বিষয়বস্তু-ধরণের নির্বিশেষে, আপনার যদি কেবল একটি প্যারামিটার থাকে তবে আপনাকে অবশ্যই অনুরোধের শিরোনামের প্যারামিটারের নাম ছাড়াই মানটি প্রেরণ করতে হবে। সুতরাং আইডি = 13 কাজ করবে না। আপনার একা 13 পাঠাতে হবে। জিম এর উত্তর দেখুন।
জেনি ও'রিলি

আমাকে ব্যবহার করতে হয়েছিল contentType: "application/x-www-form-urlencoded; charset=UTF-8", একটি সম্পূর্ণ উদাহরণের জন্য সম্পূর্ণ কেন্টিয়েন্ট এবং সার্ভার দেখুন
রাইবোল্ট

57

আমি এই সমস্যাটিতেও চলে এসেছি এবং এভাবেই আমি আমার সমস্যা সমাধান করেছি

ওয়েবপিআই কোড:

public void Post([FromBody] dynamic data)
{
    string value = data.value;
    /* do stuff */
}

ক্লায়েন্ট কোড:

$.post( "webapi/address", { value: "some value" } );

1
ক্লায়েন্টটি JSON প্রেরণ করা থাকলে এটি কাজ করে। আমি যদি স্ট্রিংয়ের মতো কোনও সাধারণ মান প্রেরণ করছি some valueতবে dataতা নাল।
ব্রায়নেস্টে

সহজ, একটি জেএস অবজেক্টটি ফেরত পাঠানোর জন্য আপনার ক্লায়েন্ট কোডটি পরিবর্তন করুন।
জর্জ


আপনি যদি জসন প্রেরণ করছেন তবে var json = JsonConvers.SerializeObject (ডেটা);
dvlelejo

41

আমি ব্যবহার Postmanকরছিলাম এবং আমিও একই ভুলটি করছিলাম .. valueস্ট্রিংয়ের পরিবর্তে জেসন অবজেক্ট হিসাবে পাস করছি

{
    "value": "test"
}

স্পষ্টত উপরেরটিটি ভুল যখন এপিআই প্যারামিটার টাইপ স্ট্রিংয়ের হয়।

সুতরাং, এপিআই দেহে ডাবল উদ্ধৃতিতে কেবল স্ট্রিংটি পাস করুন:

"test"

2
এটি ছিল আমার সমস্যা এবং সম্ভবত প্রশ্নের আসল সমাধান। একটি JSON- এনকোড স্ট্রিংয়ের উদ্ধৃতি রয়েছে
কাইল ডাব্লু

1
পোস্টম্যানেও আমি এই সমস্যার মুখোমুখি হয়েছি। দেখা যাচ্ছে যে কন্টেন্ট-প্রকারটি অ্যাপ্লিকেশন / জেসসন হিসাবে সেট করার সময় আমি শারীরিকভাবে "কাঁচা" পরিবর্তে "ফর্ম-ডেটা" বেছে নিয়েছি। আপনি zzyykk123456 এর স্ক্রিনশটগুলি অ্যাপনেট গিথুব এর ইস্যুগুলিতে উল্লেখ করতে পারেন: github.com/aspnet/Home/issues/2202
চুন লিন

এটি আমার পক্ষে কাজ করেছে। সোয়াগার (সোয়াশবাকল) ব্যবহার করে আমাকে সামগ্রীর ধরণ: অ্যাপ্লিকেশন / জেসন সেট করতে হবে এবং ডাবল উদ্ধৃতি ব্যবহার করতে হবে।
জন হেন্কেল

1
ঠিক আমার ইস্যু তবে আমাকে লক্ষ করতে হবে যে আজাক্স অনুরোধে আপনার 'ডেটা করা উচিত: JSON.stringify ("আপনার স্ট্রিং") "
আমির হোসেইন আহমদী

1
@AmirHosseinAhmadi আমি শুধু Ajax এবং বুঝতে পারল যে আসলে ব্যবহারের এই সম্মুখীন JSON.stringifyআমার গচ্চা গেল [frombody]হতে null। স্ট্রিং মান (যা একটি জসন স্ট্রিং) এ কাজ করে ডেটা ফিল্ড সেট করার পরে worked
Nexaspx

19

ডেটা মডেল হিসাবে পরিবেশন করার জন্য একটি শ্রেণি তৈরি করার চেষ্টা করুন, তারপরে আপনার ডেটা মডেল শ্রেণির বৈশিষ্ট্যের সাথে মিল রেখে বৈশিষ্ট্যযুক্ত একটি JSON অবজেক্ট পাঠান। (দ্রষ্টব্য: আমি এটি পরীক্ষা করেছি এবং এটি সবেমাত্র ডাউনলোড করা সর্বশেষতম এমভিসি 4 আরসি 2012 এর সাথে কাজ করে)।

public HttpResponseMessage Post(ValueModel model)
{
    return Request.CreateResponse<string>(HttpStatusCode.OK, "Value Recieved: " + model.Value);
}

public class ValueModel
{
    public string Value { get; set; }
}

নীচের জেএসওএন অবজেক্টটি এইচটিটিপি-পোস্ট পোস্টে প্রেরণ করা হয়েছে, সামগ্রী-প্রকারটি হ'ল অ্যাপ্লিকেশন / জেসন

{ "value": "In MVC4 Beta you could map to simple types like string, but testing with RC 2012 I have only been able to map to DataModels and only JSON (application/json) and url-encoded (application/x-www-form-urlencoded body formats have worked. XML is not working for some reason" }

আমি বিশ্বাস করি যে আপনাকে একটি ডেটা মডেল শ্রেণি তৈরি করার কারণ হ'ল সাধারণ মানগুলি ইউআরএল প্যারামিটারগুলি থেকে ধরে নেওয়া হয় এবং একটি একক জটিল মানটি শরীর থেকে অনুমান করা হয়। তাদের বৈশিষ্ট্য [FromBody]এবং [FromUrl]বৈশিষ্ট্য রয়েছে, কিন্তু [FromBody] string valueএখনও ব্যবহার করা আমার পক্ষে কার্যকর হয়নি। দেখে মনে হচ্ছে তারা এখনও অনেকগুলি বাগ তৈরি করছে তাই আমি নিশ্চিত যে ভবিষ্যতে এটি পরিবর্তিত হবে।

সম্পাদনা করুন: শরীরে কাজ করতে এক্সএমএল পেয়েছেন। ডিফল্ট এক্সএমএল সিরিয়ালাইজারটি এক্সএমএলসিরাইজারের পরিবর্তে ডেটা কন্ট্র্যাক্টসরিয়ালে পরিণত করা হয়েছিল। আমার গ্লোবাল.এক্সএক্স ফাইলটিতে নিম্নলিখিত লাইনটি স্থাপন করা এই সমস্যাটিকে সংশোধন করেছে ( রেফারেন্স )

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

এটি আমার জন্য অনুরোধের সাথে কাজ করেছে on কনটেন্টটাইপ = "অ্যাপ্লিকেশন / জেসন; চরসেট = ইউটিএফ -8";
অরবিন্দ ক্রমার

15

কিছু চেষ্টা করার পরে, আমি মনে করি ডিফল্ট আচরণটি সঠিক এবং হ্যাক করার মতো কিছুই নেই।

কেবল কৌশলটি হ'ল: যদি আপনার পোস্ট পদ্ধতির যুক্তি stringনীচের মতো হয় তবে আপনার শরীরে ডাবল উদ্ধৃতি সহ একটি সরল স্ট্রিং প্রেরণ করা উচিত (যখন এজ্যাক্স বা পোস্টম্যান ব্যবহার করার সময়),

//send "{\"a\":1}" in body to me, note the outer double quotes
[HttpPost("api1")]
public String PostMethod1([FromBody]string value)
{
    return "received " + value; //  "received {\"a\":1}"
}

অন্যথায় যদি আপনি বাইরের ডাবল উদ্ধৃতি ব্যতীত পোস্ট বডিতে কোনও জসন স্ট্রিং প্রেরণ করেন এবং অভ্যন্তরীণ উদ্ধৃতিগুলি থেকে রক্ষা পান, তবে এটি মডেল শ্রেণিতে (যুক্তির ধরণ) পার্স করা সম্ভব হবে, যেমন,{"a":1, "b":2}

public class MyPoco{
    public int a;
    public int b;
}

//send {"a":1, "b":2} in body to me
[HttpPost("api2")]
public String PostMethod2([FromBody]MyPoco value)
{
    return "received " + value.ToString();  //"received your_namespace+MyPoco"
}

11

আমি এখন কয়েক মিনিটের জন্য এই সমস্যার সমাধান খুঁজছিলাম, তাই আমি আমার সমাধানটি ভাগ করব।

আপনি যদি কোনও মডেল পোস্ট করেন তবে আপনার মডেলটির খালি / ডিফল্ট নির্মাণকারীর প্রয়োজন, অন্যথায় মডেলটি তৈরি করা যায় না, অবশ্যই। রিফ্যাক্টর করার সময় সাবধানতা অবলম্বন করুন। ;)


রিফ্যাক্টরিং হ'ল আমাকে এখানে কিছুটা, টিপটির জন্য ধন্যবাদ!
অ্যালান

10

এটি আমার পক্ষে কাজ করেছে:

  1. আপনি jQuery / Ajax থেকে পাস করতে চান এমন প্রতিটি বৈশিষ্ট্যের জন্য একটি সম্পত্তি সহ একটি সি # টিটিও ক্লাস তৈরি করুন Create

    public class EntityData
    {
        public string Attr1 { get; set; }
        public string Attr2 { get; set; }
    }
  2. ওয়েব এপিআই পদ্ধতিটি সংজ্ঞায়িত করুন:

    [HttpPost()]
    public JObject AddNewEntity([FromBody] EntityData entityData)
    {
  3. ওয়েব এপিটিকে যেমন কল করুন:

    var entityData = {
        "attr1": "value1",
        "attr2": "value2"
    };
    
    $.ajax({
        type: "POST",
        url: "/api/YOURCONTROLLER/addnewentity",
        async: true,
        cache: false,
        data: JSON.stringify(entityData),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            ...
        }
    });

এটি পোস্ট করার জন্য ধন্যবাদ, আমি অসংখ্য নমুনা চেষ্টা করেছি কিন্তু এটি আমার পক্ষে কাজ করেছে!
সাতবীর

10

আমি যেমন স্ব্যাগার বা পোস্টম্যানের সাথে একই সমস্যা রয়েছে তাদের জন্য, আপনি যদি কোনও পোস্টে স্ট্রিং হিসাবে একটি সাধারণ বৈশিষ্ট্যটি এমনকি "কন্টেন্ট টাইপ" নির্দিষ্ট করে দিয়ে থাকেন তবে আপনি এখনও নাল মান পেতে যাচ্ছেন।

কেবল উত্তীর্ণ:

MyValue

শূন্য হিসাবে নিয়ামকের মধ্যে পাবেন।

তবে আপনি যদি পাস করেন:

"MyValue"

মান ঠিক হবে।

উদ্ধৃতিগুলি এখানে পার্থক্য তৈরি করেছে। অবশ্যই এটি কেবল সোয়াগার এবং পোস্টম্যানের জন্য। উদাহরণস্বরূপ, কৌণিক ব্যবহার করে একটি ফ্রন্টএন্ড অ্যাপে এটি ফ্রেমওয়ার্কের মাধ্যমে স্বয়ংক্রিয়ভাবে সমাধান করা উচিত।


6

আমার একই সমস্যা ছিল এবং আমি দেখতে পেলাম যে বিষয়বস্তুর ধরণটি "অ্যাপ্লিকেশন / জেসন" এ পরিবর্তন করার সময় সমস্যাটি সমাধান করা হয়নি। তবে "অ্যাপ্লিকেশন / জসন; চরসেট = utf-8" কাজ করেছে।


হ্যাঁ, ওয়েব এপিআই চারসেট = utf-8 ব্যতিরেকে ডিসেরায়ালাইজ করবে না। blog.codenamed.nl/2015/05/12/…
স্যাম রুয়েবি

4

আমার অনুরূপ সমস্যা ছিল যেখানে আমার ওয়েব এপিআই পদ্ধতির অনুরোধের বিষয়টি সর্বদা শূন্য ছিল। আমি লক্ষ্য করেছি যে যেহেতু নিয়ামক ক্রিয়াকলাপের নামটি "গেট" দিয়ে উপস্থাপিত হয়েছিল, তাই ওয়েব এপিআই এটি পোস্টের পরিবর্তে এইচটিটিপি জিইটি হিসাবে বিবেচনা করে। কন্ট্রোলার ক্রিয়াটির নামকরণের পরে, এটি এখন যেমন ইচ্ছা তেমন কাজ করে।


3

কৌণিক সহ, আমি এই বিন্যাসে ডেটা পাস করতে সক্ষম হয়েছিল:

 data: '=' + JSON.stringify({ u: $scope.usrname1, p: $scope.pwd1 }),
 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' }

এবং ওয়েব এপিআই কনট্রোলারে:

    [HttpPost]
    public Hashtable Post([FromBody]string jsonString)
    {
        IDictionary<string, string> data = JsonConvert.DeserializeObject<IDictionary<string, string>>(jsonString);
        string username = data["u"];
        string pwd = data["p"];
   ......

বিকল্পভাবে, আমি এর মতো জেএসএন ডেটা পোস্ট করতে পারি:

    data: { PaintingId: 1, Title: "Animal show", Price: 10.50 } 

এবং, কন্ট্রোলারে, এই জাতীয় শ্রেণীর ধরণ গ্রহণ করুন:

    [HttpPost]
    public string POST(Models.PostModel pm)
    {

     ....
    }

যে কোনও উপায়েই কাজ করে, যদি আপনার এপিআইতে একটি প্রতিষ্ঠিত পাবলিক ক্লাস থাকে তবে জেএসএন পোস্ট করুন, অন্যথায় পোস্ট '=' + জেএসএন.স্ট্রিংফাই ({..: ..., ..: ...})


3

আমার ক্ষেত্রে সমস্যাটি ছিল যে প্যারামিটারটি একটি স্ট্রিং ছিল এবং একটি অবজেক্ট ছিল না, আমি প্যারামিটারটি নিউজফট.জসনের জবজেটে পরিণত করেছি এবং এটি কাজ করে।


2

লাইন যুক্ত করা হচ্ছে

        ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

protected void Application_Start()Global.asax.cs এ ফাংশন শেষে এএসপি.নেট এমভিসি 3 এ আমার জন্য একই সমস্যাটি স্থির করে।


সহায়তার জন্য ধন্যবাদ তবে দুর্ভাগ্যক্রমে এটি সাহায্য করেনি। আমি আপাতত লাইনটি রাখব কারণ এটি যেভাবেই সহায়তা করতে পারে!
ianrathbone

আমি এক্সএমএল পোস্ট করার সময় কেবল একই সমস্যাগুলি যুক্ত করতে
ianrathbone

2

আপনি যদি আপনার এক্সএমএল ফর্ম্যাটর বা জেএসএন ফর্ম্যাটারের জন্য ডেটা কন্ট্র্যাক্টসরিয়ালাইজার ব্যবহার করে থাকেন তবে আপনার এ থেকে মুক্তি পাওয়া দরকার। আমার ওয়েবএপিপিফাইফিতে এটি ছিল:

public static void Register(HttpConfiguration config)
{
     config.Routes.MapHttpRoute(
           name: "DefaultApi",
           routeTemplate: "api/{controller}/{id}",
           defaults: new { id = RouteParameter.Optional }
     );    

     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
     jsonFormatter.UseDataContractJsonSerializer = true;
}

কেবল আমি মন্তব্য করি jsonFormatter.UseDataContractJsonSerializer = true;এবং আমার ইনপুট প্যারামিটারটি আর শূন্য হয় না। আমাকে একটি ক্লু দেওয়ার জন্য 'ডেসপারটার'কে ধন্যবাদ।


2

আপনি যদি আপনার প্রেরিত জেএসওএন সম্পর্কে নিশ্চিত হন তবে আপনাকে অবশ্যই আপনার এপিআইটি সন্ধান করতে হবে:

  1. Microsoft.AspNet.WebApi.Tracingপ্যাকেজ ইনস্টল করুন
  2. যোগ config.EnableSystemDiagnosticsTracing();মধ্যে WebApiConfigবর্গ ভিতরে Registerপদ্ধতি।

এখন ডিবাগ আউটপুটটি দেখুন এবং আপনি সম্ভবত একটি অবৈধ খুঁজে পাবেন ModelState লগ এন্ট্রি পাবেন।

যদি ModelStateঅবৈধ হয় তবে আপনি এর আসল কারণটি খুঁজে পেতে পারেন Errors:

এমন ব্যতিক্রম কেউ কল্পনাও করতে পারে না:

Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

তুমি আমার জীবন বাঁচিয়েছ মডেল হিসাবে নালাগুলি পাওয়া এবং প্যাকেজ ইনস্টল করার পরে, পাওয়া গেছে যে আমার জেএসএন সঠিক ফর্ম্যাটে নেই।
খিজার ইকবাল

2

আমার প্যারামিটার হিসাবে নাল হওয়ার একই সমস্যা ছিল, তবে এটি বড় অবজেক্টের সাথে সম্পর্কিত। দেখা গেল সমস্যাটি আইআইএস সর্বোচ্চ দৈর্ঘ্যের সাথে সম্পর্কিত। এটি ওয়েবকনফাইগে কনফিগার করা যায়।

  <system.web>
    <httpRuntime targetFramework="4.7" maxRequestLength="1073741824" />
  </system.web>

আমি ভাবছি কেন ওয়েব এপিআই ত্রুটিটি দমন করেছে এবং আমার এপিআইগুলিতে নাল বস্তু প্রেরণ করে। আমি মাইক্রোসফ্ট.অ্যাসনেট.ওয়েবপিপি.ট্রেসিং ব্যবহার করে ত্রুটি পেয়েছি।



1

আমি জানি এটি এই প্রশ্নের উত্তর নয়, তবে আমার সমস্যার সমাধান অনুসন্ধান করার সময় আমি এটি পেরিয়ে এসেছি।

আমার ক্ষেত্রে, জটিল ধরণটি আবদ্ধ ছিল না তবে আমি কোনও পোস্ট করছি না, আমি ক্যোরিস্ট্রিং প্যারামিটারগুলি সহ একটি জিইটি করছি। সমাধানটি ছিল যুক্তিটিতে [থেকে উড়ি] যুক্ত করা:

public class MyController : ApiController
{
    public IEnumerable<MyModel> Get([FromUri] MyComplexType input)
    {
        // input is not null as long as [FromUri] is present in the method arg
    }
}

কারণ জিইটি ব্যবহার করার সময় অনুরোধের শৃঙ্খলা উপেক্ষা করা হয় (এবং কখনও কখনও ত্রুটির কারণও হয়)। এটি এখন কাজ করার কারণটি হল খ / সি, এখন আপনি ক্যোয়ারী স্ট্রিংয়ে
প্যারামগুলি দিয়ে যাচ্ছেন

1

ফিডলারের ক্ষেত্রেও আমার একই সমস্যা ছিল। আমি ইতিমধ্যে Content-Type: application/json; charset=utf-8বা Content-Type: application/jsonঅনুরোধ শিরোনামে ছিল।

আমার অনুরোধের মূল একটি প্লেইন স্ট্রিং ছিল, এবং বেহালাবাদক আমি লিখেছিলাম: {'controller':'ctrl'}। এটি আমার পোস্ট পদ্ধতিতে স্ট্রিং প্যারামিটারটিকে তৈরি করে null

স্থির করুন : উদ্ধৃতি চিহ্নগুলি ব্যবহার করতে ভুলবেন না, যার মাধ্যমে একটি স্ট্রিং নির্দেশ করে। অর্থাৎ এটি লিখে লিখে ঠিক করেছি "{'controller':'ctrl'}"। (দ্রষ্টব্য: জেএসওএন লেখার সময়, হয় অ্যাডাস্ট্রোফগুলি ব্যবহার করার বিষয়ে নিশ্চিত হন বা এই জাতীয় উদ্ধৃতি চিহ্নগুলি এড়ানোর জন্য নিশ্চিত হন "{\"controller\":\"ctrl\"}"))।


পোস্টম্যানেও আমাকে একই কাজ করতে হয়েছিল। আমি যখন স্প্রিং পরিষেবাগুলিতে কল করি তখন আমার এটি করার দরকার নেই। । নেট পাশে কোনও সমস্যার মতো মনে হচ্ছে।
ম্যালকম ম্যাকরবার্টস

1

আমি এমভিসি into তে যে সাধারণ জেএসওএন অবজেক্টটি মোকাবেলা করেছি তার সবচেয়ে সহজ উপায়টি নিউটনসফট জবজেক্টের মতো পোস্ট প্যারামিটারের ধরণটি পেয়েছে:

public ActionResult Test2([FromBody] jObject str)
{
        return Json(new { message = "Test1 Returned: "+ str }); ;
}

পরীক্ষার ( [FromBody] object body, [FromHeader(Name="Content-Type")] string bodyMediaType) bodyMediaType == "application.json"জোবজেক্ট বিকল্পের জন্য সুযোগ সরবরাহের আগে শরীরের ingালাইয়ের আগে যাচাই করা আরও ভাল কাজ করতে পারে ।
ভ্লাদএইচ

1

আমার জন্য সর্বোত্তম সমাধানটি নীচের মতো পুরো এইচটিটিপি চলছে:

[Route("api/open")]
[HttpPost]
public async Task<string> open(HttpRequestMessage request)
{
    var json = await request.Content.ReadAsStringAsync();
    JavaScriptSerializer jss = new JavaScriptSerializer();            
    WS_OpenSession param = jss.Deserialize<WS_OpenSession>(json);
    return param.sessionid;
}

এবং তারপরে পোস্ট বডিতে আপনি যে অবজেক্টটি প্রত্যাশা করছেন তার স্ট্রিংকে ডিসরিয়ালাইজ করা হচ্ছে। আমার জন্য, ডাব্লুএস_অপেনসেশন একটি শ্রেণি যা সেশনড, ব্যবহারকারী এবং কী রয়েছে।

আপনি সেখান থেকে প্যারাম অবজেক্টটি ব্যবহার করতে এবং এর বৈশিষ্ট্যগুলিতে অ্যাক্সেস করতে পারেন।

খুব কার্যকর।

আমি এই ইউআরএল থেকে উত্সাহিত বলেছি:

http://bizcoder.com/posting-raw-json-to-web-api


1

জটিল ধরণের জন্য, ওয়েব এপিআই একটি মিডিয়া-টাইপ ফর্ম্যাটর ব্যবহার করে বার্তাটির প্রধান অংশ থেকে মানটি পড়ার চেষ্টা করে।

[Serializable]আপনার মডেল শ্রেণিকে সজ্জায় কোনও বৈশিষ্ট্য পেয়েছে কিনা দয়া করে তা পরীক্ষা করে দেখুন ।

বৈশিষ্ট্যটি কার্যকর হয় কিনা তা সরিয়ে ফেলুন। এটি আমার পক্ষে কাজ করেছে।


1

আমি পার্টিতে কিছুটা দেরি করেছি, তবে নিয়ামক ব্যবহার করার সময় যে কেউ NULL মান ধরেই হোঁচট খায় কেবল সে আপনার পোষ্টের অনুরোধের সামনের অংশে "=" যুক্ত করে।

আমি যখন অ্যাপ্লিকেশন / জসন সামগ্রী সামগ্রী ব্যবহার করতাম তখন নিয়ামকও একটি নূন্যতম মূল্য পাস করে । নীচে "অ্যাপ্লিকেশন / x-www-form-urlencoded" লিখিত সামগ্রী নোট করুন। এপিআই থেকে রিটার্নের ধরনটি হ'ল "অ্যাপ্লিকেশন / জেসন"।

 public static string HttpPostRequest(string url, Dictionary<string, string> postParameters)
    {
        string postData = "=";

        foreach (string key in postParameters.Keys)
        {
            postData += HttpUtility.UrlEncode(key) + "="
                  + HttpUtility.UrlEncode(postParameters[key]) + ",";
        }

        HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        myHttpWebRequest.Method = "POST";

        byte[] data = System.Text.Encoding.ASCII.GetBytes(postData);

        myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
        myHttpWebRequest.ContentLength = data.Length;

        Stream requestStream = myHttpWebRequest.GetRequestStream();
        requestStream.Write(data, 0, data.Length);
        requestStream.Close();

        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

        Stream responseStream = myHttpWebResponse.GetResponseStream();

        StreamReader myStreamReader = new StreamReader(responseStream, System.Text.Encoding.Default);

        string pageContent = myStreamReader.ReadToEnd();

        myStreamReader.Close();
        responseStream.Close();

        myHttpWebResponse.Close();

        return pageContent;
    }

1

আপনি কোন ধরণের মান পোস্ট করতে চান তা বিবেচনাধীন নয়, কেবল স্ট্রিং হিসাবে এটি পেতে উদ্ধৃতি চিহ্নের মধ্যে এটি বন্ধ করুন। জটিল ধরণের জন্য নয়।

জাভাস্ক্রিপ্ট:

    var myData = null, url = 'api/' + 'Named/' + 'NamedMethod';

    myData = 7;

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = "some sentence";

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = { name: 'person name', age: 21 };

    $http.post(url, "'" + JSON.stringify(myData) + "'")
         .then(function (response) { console.log(response.data); });

    $http.post(url, "'" + angular.toJson(myData) + "'")
         .then(function (response) { console.log(response.data); });

গ #:

    public class NamedController : ApiController
    {
        [HttpPost]
        public int NamedMethod([FromBody] string value)
        {
            return value == null ? 1 : 0;
        }
    }

1

যদি আপনি [ফ্রমবিডি] টীকাটি রাখেন এবং আপনার পদ্ধতির পরামিতি হিসাবে আপনার কাছে একটি ডটো অবজেক্ট রয়েছে এবং এখনও ডেটা পেতে সক্ষম না হন তবে আপনার ডিটিওর বৈশিষ্ট্য এবং ক্ষেত্রগুলি সন্ধান করুন।

আমার একই সমস্যা ছিল, যেখানে আমার ডিটিও শূন্য হয়ে আসছে। আমি কারণটি খুঁজে পেয়েছি কারণগুলির মধ্যে একটি বৈশিষ্ট্যটি এমন কোনও বস্তুর দিকে ইঙ্গিত করছে যা সিরিয়ালাইজ করা যায় না :( যার ফলে মিডিয়া-ফর্ম্যাটর ডেটা বিশ্লেষণ করতে ব্যর্থ হয় Thus সুতরাং বস্তুটি সর্বদা নাল ছিল Hope আশা করি এটি অন্যকেও সহায়তা করে Hope


1

আপনার ডেটা ধরণের পরীক্ষা করুন। ডটনেট মডেল বাইন্ডার কোনও ফ্লোটকে পূর্ণসংখ্যায় রূপান্তরিত করবে না (এবং আমি অন্যান্য সম্পর্কিত ধারণাটি ধরে নিচ্ছি)। এটি পুরো মডেলটিকে প্রত্যাখ্যান করবে।

আপনার যদি জেসন এটির মতো থাকে:

{
    "shoeSize": 10.5
}

তবে আপনার সি # মডেলটি দেখতে এমন দেখাচ্ছে:

class Shoe{
    public int shoeSize;
}

মডেল বাইন্ডার মডেলটিকে প্রত্যাখ্যান করবে এবং আপনি বাতিল হয়ে যাবেন।


1

আমি এটির জন্য বেশ দেরি করে ফেলেছি তবে একই রকম সমস্যা ছিল এবং একদিন পরে এখানে অনেক উত্তর পেয়েছি এবং পটভূমি পাওয়ার পরে আমি একটি ওয়েব এপিআই 2 বা একাধিক পরামিতিগুলি ফেরত দেওয়ার সবচেয়ে সহজ / লাইটওয়েট সমাধান পেয়েছি 2 অ্যাকশন হিসাবে রয়েছে অনুসরণ:

এটি অনুমান করে যে আপনি কীভাবে কোনও ওয়েব এপিআই কন্ট্রোলার / অ্যাকশনটিকে সঠিক রাউটিং সহ সেটআপ করতে জানেন, যদি তা উল্লেখ না করা হয়: https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-st সূত্র- সহ -aspnet ওয়েব-API / টিউটোরিয়াল-আপনার প্রথম ওয়েব-API

প্রথমে কন্ট্রোলার অ্যাকশন, এই সমাধানটির জন্য নিউটনসফট.জসন গ্রন্থাগারও প্রয়োজন।

[HttpPost]
public string PostProcessData([FromBody]string parameters) {
    if (!String.IsNullOrEmpty(parameters)) {
        JObject json = JObject.Parse(parameters);

        // Code logic below
        // Can access params via json["paramName"].ToString();
    }
    return "";
}

ক্লায়েন্ট সাইড jQuery ব্যবহার করে

var dataToSend = JSON.stringify({ param1: "value1", param2: "value2"...});
$.post('/Web_API_URI', { '': dataToSend }).done(function (data) {
     console.debug(data); // returned data from Web API
 });

আমি যে মূল সমস্যাটি পেয়েছি তা নিশ্চিত করে দেওয়া হয়েছিল যে আপনি কেবলমাত্র একটি একক সামগ্রিক প্যারামিটারটি ওয়েব এপিআইতে ফেরত পাঠিয়েছেন এবং নিশ্চিত করুন যে এটির কোনও নাম নেই কেবলমাত্র { '': dataToSend }অন্যথায় আপনার মানটি সার্ভারের দিক থেকে বাতিল হয়ে যাবে।

এর সাহায্যে আপনি একটি JSON স্ট্রাকচারে ওয়েব এপিআইতে এক বা একাধিক পরামিতি প্রেরণ করতে পারেন এবং জটিল ডেটা হ্যান্ডেল করার জন্য আপনার কোনও অতিরিক্ত অবজেক্ট সার্ভার সাইড ঘোষণা করার দরকার নেই। JObject আপনাকে সময়ক্রমে আপনার প্যারামিটারগুলি পরিবর্তিত হওয়া সহজতর স্কেলাবিলিটিটি মঞ্জুর করে সমস্ত পরামিতিগুলিতে গতিশীলভাবে পুনরাবৃত্তি করার অনুমতি দেয়। আশা করি এটি আমার মতো লড়াই করে এমন কাউকে সহায়তা করবে।


0

ওয়েবএপিআই-তে দেহে একক প্যারামিটারটি সঠিকভাবে পাস করা এই কোডটির কাজ করে $.post(url, { '': productId }

এবং এটি কর্মে ধরা [HttpPost] public ShoppingCartAddRemoveViewModel Delete([FromBody]string value)

কী হ'ল ম্যাজিক শব্দ 'মান' ব্যবহার করা। এটি ইনট বা কিছু আদিম ধরণেরও হতে পারে। বিষয়বস্তু-ধরণের বা শিরোনাম সংশোধন করার বিষয়টি মেস নয় যে এই কোডটি এমভিসি পোস্ট ক্রিয়ায় কাজ করে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.