2012-04-02 14 views
15

के किसी ऑब्जेक्ट को पढ़ने के लिए उपलब्ध है, मुझे पूरा यकीन नहीं है कि यहां क्या हुआ है। मैंने कहीं चीजों को गड़बड़ कर दिया होगा, लेकिन मुझे नहीं पता कि क्या।एएसपी.नेट वेब एपीआई - नहीं 'MediaTypeFormatter' प्रकार 'Int32'

मेरे एपीआई नियंत्रक विधि इस प्रकार है:

public HttpResponseMessage<string> Put(int id) 

मैं एक स्ट्रिंग के रूप में अच्छी तरह से साथ एक ही त्रुटि की कोशिश की है।

कोई विचार?

धन्यवाद।

संपादित करें: स्पष्ट होने के लिए - आईडी मार्ग पैरामीटर है। अनुरोध का शरीर जेएसओएन है। यदि मैं मार्ग पैरामीटर को हटाता हूं, तो विधि सामान्य के रूप में कार्य करती है।

+0

क्या आप कच्चे अनुरोध (फिडलर या फायरबग से) पोस्ट कर सकते हैं? – tpeczek

+1

क्या आपने कोई डिफ़ॉल्ट फॉर्मेटर्स हटा दिया था? क्या आप कॉन्फ़िगरेशन कोड भी पोस्ट कर सकते हैं। – tugberk

+0

आप कौन से कॉन्फ़िगरेशन अनुभाग चाहते हैं? –

उत्तर

6

कृपया ब्लॉग पोस्ट निम्न को पढ़ें:

यह सरल मानकों का प्रयोग करके साथ सबसे विशिष्ट समस्याओं का वर्णन करता।आपका अनुरोध कैसा दिखता है, इस बारे में और जानकारी के बिना यह निर्धारित करना संभव नहीं है कि आपने कौन सी हिट की है।

अद्यतन

एक और ज्ञात बग मार्ग मूल्यों पर विचार है। यदि पोस्ट/पुट/पैच अनुरोध के लिए फॉर्मेटर्स में निर्मित नहीं किया गया है, तो रूट मान पैरामीटर बाध्य नहीं हो रहे हैं। इस का सबसे अच्छा समाधान हल करने के लिए के रूप में नीचे वर्णित ActionFilterAttribute लिखना है:

+0

मेरी समस्या विशेष रूप से मार्ग पैरामीटर के साथ है। उपरोक्त विधि परिभाषा में int आईडी। –

+0

@ रॉबर्टोबोनिनी मैंने मार्ग मूल्यों के लिए एक और ज्ञात बग के लिए प्रतिक्रिया अद्यतन की है। – tpeczek

+0

नहीं पता था कि यह एक बग था - धन्यवाद। –

13

आश्चर्य की बात है कि, int और स्ट्रिंग में डिफ़ॉल्ट रूप से MediaTypeFormatter नहीं है, इसलिए यह नहीं जानता कि उन प्रकारों को कैसे संभालना है।

बॉक्स के बाहर संभालने के लिए केवल एक ही प्रकार है जो JSON, XML, और url-encoded डेटा बनाते हैं। यह बोली, सरकारी asp.net वेबसाइट से है http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

वेब एपीआई में, मीडिया प्रकार निर्धारित करता है कि वेब एपीआई serializes और HTTP संदेश के मुख्य भाग deserializes। एक्सएमएल, जेएसओएन, और फॉर्म-यूरेनकोडेड डेटा के लिए अंतर्निहित समर्थन है, और आप अतिरिक्त मीडिया प्रकार मीडिया मीडियार लिखकर समर्थन कर सकते हैं।

अब आप अपने खुद के MediaTypeFormatter (लिंक मैं प्रदान की बताएंगे कि कैसे करेंगे) लिखना 'कर सकते हैं', लेकिन जब से asp.net वेब एपीआई परीक्षण में अब भी है मैं कस्टम formatters का उपयोग कर इसे के साथ परेशानी का एक बहुत पड़ा है तारों जैसे सरल प्रकार के लिए। मैंने पाया कि xml/json में जो भी मूल्य आप PUT करना चाहते हैं उसे लपेटना बहुत आसान है और यह स्वचालित रूप से deserialized हो जाएगा। , कि अधिक जानकारी के लिए यहाँ मेरी पोस्ट देखें When HTTP-POST has body, url parameter is null

अपने विशिष्ट उदाहरण आपकी PUT शरीर कैसा दिखेगा के लिए,

<message> 
    <id>6</id> 
</message> 

फिर/xml पाठ में अपने http अनुरोध की सामग्री प्रकार सेट करना सुनिश्चित करें (या यदि आप इसका उपयोग करना चुनते हैं तो एप्लिकेशन/जेसन)। और इसे चर में ठीक से क्रमबद्ध करना चाहिए।

+0

यह लागू होगा यदि यह शरीर में पारित किया जा रहा है - यहां मेरा मुद्दा मार्ग पैरामीटर के साथ है - इस मामले में, आईडी। –

+0

हां, यह एएसपीनेट वेब एपीआई बीटा में एक बग प्रतीत होता है। जब आपके पास एक पुट या POST में कोई शरीर होता है तो यूआरएल पैरामीटर शून्य हो जाएगा। एकमात्र विकल्प जो मैं समय के लिए पेशकश कर सकता हूं वह शरीर में सबकुछ पास करना है, हालांकि मुझे पता है कि यह आपकी रीस्टफुल यूआरएल संरचना से समझौता कर सकता है जो महत्वपूर्ण है। – Despertar

+0

मुझे लगता है कि यह स्वीकार्य उत्तर होना चाहिए। वर्तमान स्वीकृत उत्तर इस मुद्दे को संबोधित करता है लेकिन समाधान नहीं है। इस जवाब में समाधान है। –

5

क्या आप अनुरोध संदेश के शरीर में int मान रखते हैं? यदि हां, तो प्रारूप क्या है?

यदि सामग्री का प्रकार टेक्स्ट है, तो वेब एपीआई नहीं जान पाएगा कि इसके साथ क्या करना है, क्योंकि वेब एपीआई टेक्स्ट के लिए मीडिया फॉर्मेटर प्रदान नहीं करता है। Despertar के रूप में, आप एक कस्टम फॉर्मेटर लिख सकते हैं।

तुम भी कुछ इस तरह कर सकते हैं:

public void Put() 
{ 
    var s = Request.Content.ReadAsStringAsync().Result; 
} 
+0

शरीर जेएसओएन है। मुझे बस रूट पैरामीटर के साथ काम करने की ज़रूरत है। अगर मैं विधि परिभाषा से मार्ग पैरामीटर को हटा देता हूं, तो यह काम करता है। –

0

मैं एक एक json शरीर के साथ DELETE तैनात है और इस प्राप्त किया। पैरामीटर के साथ पोस्टिंग समस्या हल।

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