2012-06-12 7 views
74

मैं एक ApiController पर निम्नलिखित कार्रवाई मिल गया है:ASP.NET वेब एपीआई: अनुरोध किया गया संसाधन का समर्थन नहीं करता http विधि 'प्राप्त'

public string Something() 
{ 
    return "value"; 
} 

और मैं अपने मार्गों कॉन्फ़िगर कर दिया है इस प्रकार है:

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

बीटा में, यह ठीक काम किया, लेकिन मैं सिर्फ नवीनतम रिलीज़ उम्मीदवार के लिए अद्यतन और अब मैं इस तरह कॉल पर त्रुटि मिल रही हूँ:

गु ई अनुरोधित संसाधन http विधि 'GET' का समर्थन नहीं करता है।

यह अब और क्यों काम नहीं करता है?

(मुझे लगता है कि मैं {कार्रवाई} से छुटकारा पाने सकता है और सिर्फ नियंत्रकों की एक टन है, लेकिन है कि गंदा लगता है।)

उत्तर

94

आप कॉन्फ़िगर नहीं किया है नियंत्रक में अपनी कार्रवाई पर किसी भी HttpMethod, यह माना जाता है आरसी में केवल एचटीपीपोस्ट बनें। बीटा में, यह सभी विधियों का समर्थन करने के लिए माना जाता है - प्राप्त करें, दबाएं, पोस्ट करें और हटाएं। यह बीटा से आरसी में एक छोटा सा बदलाव है। [AcceptVerbs ("GET", "POST")] के साथ आप अपनी कार्रवाई पर एक से अधिक httpmethod आसानी से डीकोर कर सकते हैं।

+0

बस इसका सामना करना पड़ा, फिक्स के लिए धन्यवाद, लेकिन उत्सुक, मुझे अपने कस्टम तरीकों के साथ ऐसा क्यों करना है, लेकिन डिफ़ॉल्ट "प्राप्त करें" विधि नहीं है? मेरे पास एक गेट विधि है जो नियंत्रक के लिए टेम्पलेट द्वारा बनाई गई थी, लेकिन इसे सजाया नहीं गया है। नाम के कारण यह सिर्फ सम्मेलन से मिलता है? – SelAromDotNet

+3

@ जोश: हाँ! जब कार्रवाई विधि का नाम "प्राप्त करें ..." से शुरू होता है तो आपको इसे GET विधि के रूप में चिह्नित करने की आवश्यकता नहीं होती है। यहां और पढ़ें: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api –

+0

मैंने उत्तर में सुझाव दिया था लेकिन अब दोनों मेरी कॉल, गेट और पोस्ट, एक्शन पाने के लिए रीडायरेक्ट किए जा रहे हैं। कोई मदद कृपया? –

14

यह निश्चित रूप से बीटा से आरसी में बदलाव है। प्रश्न में दिए गए उदाहरण में, अब आपको [HttpGet] या [AcceptVerbs ("GET")] के साथ अपनी कार्रवाई को सजाने की आवश्यकता है।

यदि आप क्रिया आधारित क्रियाओं को मिश्रण करना चाहते हैं तो यह समस्या का कारण बनता है (यानी "GetSomething", "PostSomething") गैर क्रिया आधारित क्रियाओं के साथ। यदि आप उपर्युक्त गुणों का उपयोग करने का प्रयास करते हैं, तो यह आपके नियंत्रक में किसी भी क्रिया आधारित क्रिया के साथ संघर्ष का कारण बन जाएगा। प्रत्येक क्रिया के लिए अलग-अलग मार्गों को परिभाषित करने के लिए एक राशि प्राप्त करने के लिए एक तरीका है, और क्रिया के नाम पर डिफ़ॉल्ट कार्रवाई सेट करें। इस दृष्टिकोण का उपयोग आपके एपीआई में बाल संसाधनों को परिभाषित करने के लिए किया जा सकता है। उदाहरण के लिए, निम्न कोड का समर्थन करता है: "/ संसाधन/आईडी/बच्चे" जहां आईडी और बच्चे वैकल्पिक हैं।

 context.Routes.MapHttpRoute(
      name: "Api_Get", 
      routeTemplate: "{controller}/{id}/{action}", 
      defaults: new { id = RouteParameter.Optional, action = "Get" }, 
      constraints: new { httpMethod = new HttpMethodConstraint("GET") } 
     ); 

     context.Routes.MapHttpRoute(
      name: "Api_Post", 
      routeTemplate: "{controller}/{id}/{action}", 
      defaults: new { id = RouteParameter.Optional, action = "Post" }, 
      constraints: new { httpMethod = new HttpMethodConstraint("POST") } 
     ); 

उम्मीद है कि वेब एपीआई के भविष्य के संस्करणों को इस परिदृश्य के लिए बेहतर समर्थन मिलेगा। वर्तमान में aspnetwebstack codeplex प्रोजेक्ट, http://aspnetwebstack.codeplex.com/workitem/184 पर लॉग इन किया गया एक समस्या है। यदि यह ऐसा कुछ है जिसे आप देखना चाहते हैं, तो कृपया इस मुद्दे पर वोट दें।

51

सभी उपरोक्त जानकारी सही है, मैं यह भी इंगित करना चाहूंगा कि [AcceptVerbs()] एनोटेशन सिस्टम.Web.Mvc और System.Web.Http नामस्थान दोनों में मौजूद है।

आप सिस्टम.Web.Http का उपयोग करना चाहते हैं यदि यह एक वेब एपीआई नियंत्रक है।

+0

thx @Eric, मैं सोच रहा था कि यह क्यों काम नहीं करेगा ... – jbl

+0

@Eric। बहुत बढ़िया, यही वजह है कि यह मेरे लिए काम नहीं कर रहा था। मेरे पास मेरी कार्रवाई पर क्रिया थी लेकिन इसे वेब.एमवीसी के माध्यम से संदर्भित किया गया था, इसलिए काम नहीं कर रहा था। – dreza

+0

बढ़िया, आपने मेरा दिन –

25

हालांकि यह ओपी का उत्तर नहीं है, लेकिन मेरे पास एक पूरी तरह से अलग मूल कारण से एक ही त्रुटि थी; इसलिए यदि यह किसी और की मदद करता है ...

मेरे लिए समस्या गलत तरीके से नामित विधि पैरामीटर था जिसके कारण वेबएपीआई अप्रत्याशित रूप से अनुरोध को रूट करने का कारण बन गया।

[HttpGet] 
public Programme GetProgrammeById(int id) 
{ 
    ... 
} 

[HttpDelete] 
public bool DeleteProgramme(int programmeId) 
{ 
    ... 
} 

नष्ट करने के लिए .../api/कार्यक्रमों/3 DeleteProgramme मार्ग पर प्रेषित नहीं हो रहे थे के रूप में मैं उम्मीद थी, लेकिन GetProgrammeById है, क्योंकि DeleteProgramme एक पैरामीटर नहीं था अनुरोध: मैं अपने ProgrammesController में निम्न विधियों में है आईडी का नाम GetProgrammeById निश्चित रूप से DELETE को अस्वीकार कर रहा था क्योंकि इसे केवल GET स्वीकार करने के रूप में चिह्नित किया गया है।

तो ठीक आसान था:

[HttpDelete] 
public bool DeleteProgramme(int id) 
{ 
    ... 
} 

और सब कुछ ठीक है। मूर्खतापूर्ण गलती वास्तव में डीबग करने के लिए मुश्किल है।

14

आप HttpGet के साथ अपने विधि सजा रहे हैं, तो नियंत्रक के शीर्ष पर निम्न using जोड़ें:

using System.Web.Http; 

आप System.Web.Mvc का उपयोग कर रहे हैं, तो इस समस्या हो सकती है।

+1

यह सच है, और हास्यास्पद रूप से .NET संदेश स्पष्ट रूप से नहीं दिखा रहा है। –

2

उपरोक्त के समान समस्या, लेकिन काफी अलग रूट। मेरे लिए, यह था कि मैं एक https पुनर्लेखन नियम के साथ एक एंडपॉइंट मार रहा था। Http पर इसे मारने से त्रुटि हुई, https के साथ अपेक्षित के रूप में काम किया।

2

ओपी के समान सेटअप है। कई क्रियाओं वाला एक नियंत्रक ... कम "गन्दा" :-)

मेरे मामले में मैं एक नई कार्रवाई जोड़ते समय "[HttpGet]" भूल गया।

[HttpGet] 
public IEnumerable<string> TestApiCall() 
{ 
    return new string[] { "aa", "bb" }; 
}