2014-11-22 2 views
8

मैं इस नियंत्रक कार्रवाईवेबएपी पोस्ट बिना [FromBody] के काम करता है?</p> <pre><code>[HttpPost] [ActionName("aaa")] public HttpResponseMessage aaa(Z z) //notice - no [FromBody] { return Request.CreateResponse(HttpStatusCode.OK, 1); } </code></pre> <p>कहाँ <code>Z</code> है:

public class Z 
{ 
    public string a { get; set; } 
} 

लेकिन जब मैं Fiddler माध्यम से पोस्ट:

POST http://localhost:11485/api/profiles/aaa HTTP/1.1 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Host: localhost:11485 
Content-Length: 3 
Accept-Encoding: gzip, deflate 
Accept-Language: en-US,en;q=0.8,he;q=0.6 
Cache-Control: no-cache 
Connection: keep-alive 

a=1 

मैं वास्तव में यह काम कर रहा है देख सकते हैं:

enter image description here

प्रश्न:

यदि हां, तो यह कैसे बिना काम करता है [FromBody] विशेषता? और क्या मुझे अभी भी इस विशेषता को लिखने की आवश्यकता नहीं है?

इसके अलावा, परिदृश्य क्या है जहां इस विशेषता को नहीं लिखना - समस्याएं पैदा करेगा?

+0

दिलचस्प सवाल। मुझे यहां कुछ जानकारी मिली है: http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/ –

उत्तर

12

बाध्यकारी एमवीसी और वेब एपीआई के लिए अलग है। डिफ़ॉल्ट रूप से, एएसपी.नेट वेब एपीआई अनुरोध संदेश निकाय और यूआरआई, क्वेरी स्ट्रिंग इत्यादि से सरल प्रकारों से जटिल प्रकारों को बांधता है। चूंकि आपने Z निर्दिष्ट किया है, जो एक वर्ग (जटिल प्रकार) है, यह बिना शरीर के क्रिया विधि पैरामीटर को पॉप्युलेट करता है आपको [FromBody] निर्दिष्ट करना होगा। दूसरी तरफ, यदि आपका अनुरोध शरीर के बिना http://localhost:11485/api/profiles/aaa?a=1 है, तो यह आपके जटिल पैरामीटर से स्वचालित रूप से बाध्य नहीं होगा। उस स्थिति में, आपको [FromUri] इस तरह निर्दिष्ट करना होगा: public HttpResponseMessage aaa([FromUri]Z z)

दूसरी ओर, कहें कि आपकी क्रिया विधि public HttpResponseMessage aaa(string a) है। अब हमारे पास string है, जो एक साधारण प्रकार है। इस मामले में, संदेश संदेश के बिना http://localhost:11485/api/profiles/aaa?a=1 वेब API को [FromUri] निर्दिष्ट किए बिना पैरामीटर को सही ढंग से बांधने देगा। अब, यदि आप इस मामले में शरीर से बांधना चाहते हैं, तो आपको public HttpResponseMessage aaa([FromBody]string a) निर्दिष्ट करना होगा। बेशक, a के मुख्य नाम के बिना, application/x-www-form-urlencoded के लिए, इस शरीर के लिए =1 होना चाहिए।

नीचे की रेखा - आपका पैरामीटर (सरल प्रकार या जटिल प्रकार) निर्धारित करता है कि वेब एपीआई कैसे बांधता है। इसे डिफ़ॉल्ट व्यवहार से अलग तरीके से काम करने के लिए, आपको FromUri या FromBody के माध्यम से बताना होगा।

पीएस। मैंने जो कुछ भी ऊपर बताया है वह अच्छी पुरानी एएसपी.नेट वेब एपीआई (2 सहित) के लिए पूरी तरह से अच्छा है। एएसपी.नेट 5.0 ए.के.ए. एएसपी.नेट वीएनएक्स्ट या एएसपी.नेट एमवीसी 6.0, एमवीसी और वेब एपीआई में एकीकृत किया गया है। शरीर से जटिल प्रकार को बांधने के लिए, आपको [FromBody] निर्दिष्ट करना होगा।

+1

बहुत विस्तृत स्पष्टीकरण। धन्यवाद बद्री। एक साइड नोट के रूप में, मैं वास्तव में जानना चाहता हूं कि एमएस ने सोचा था कि जब उन्होंने सरल प्रकार पोस्ट करते समय केवल '= 1' पैटर्न की अनुमति दी थी .... मेरा मतलब है - मुझे इसकी परवाह नहीं है, लेकिन बीमारों को उपभोक्ताओं को भेजने के लिए कहना है केवल = 1। और वह बहुत (!) खराब है –

+0

ठीक है, शरीर केवल एक बार पढ़ा जाता है और पूरी तरह से एक पैरामीटर से जुड़ा होता है। उदाहरण के लिए, आप शरीर के आधे हिस्से को एक पैरामीटर से बाध्य नहीं कर सकते हैं और दूसरे को आराम कर सकते हैं। जब आप एक साधारण प्रकार के लिए बाध्यकारी शरीर होते हैं, तो कुंजी की कोई आवश्यकता नहीं होती है, क्योंकि वहां केवल पैरामीटर हो सकता है जिसके लिए यह बाध्य है। लेकिन हालांकि थोड़ा उलझन में है। – Badri

संबंधित मुद्दे