ASP.NET वेब एप: अनुरोधित संसाधन http विधि 'GET' का समर्थन नहीं करता है


92

मुझे ApiController पर निम्नलिखित कार्रवाई मिली है:

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

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

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

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

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

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

(मुझे लगता है कि मैं {कार्रवाई} से छुटकारा पा सकता हूं और बस एक टन नियंत्रक बना सकता हूं, लेकिन यह गड़बड़ लगता है।)

जवाबों:


107

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


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

3
@ जोश: हाँ! जब एक्शन विधि का नाम "गेट ..." से शुरू होता है, तो आपको इसे GET विधि के रूप में चिह्नित नहीं करना होगा। यहां पढ़ें: asp.net/web-api/overview/web-api-rout-and-actions/…
जेनी ओ'रेली

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

54

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

यदि आप Web API कंट्रोलर है तो आप System.Web.Http का उपयोग करना चाहते हैं।


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

महान, आपने मेरा दिन बचा लिया
होसैन नरिमनी रेड

बहुत बहुत धन्यवाद, क्योंकि System.Web.Mvc मेरे लिए अच्छा नहीं था।
बुरक करकुस

34

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

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

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

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

DELETE के अनुरोध ... / api / प्रोग्राम / 3 को DeleteProgramme पर रूट नहीं किया जा रहा था जैसा कि मुझे उम्मीद थी, लेकिन GetProgrammeById को, क्योंकि DeleteProgramme में id का पैरामीटर नाम नहीं था। GetProgrammeById तब निश्चित रूप से DELETE को अस्वीकार कर रहा था क्योंकि यह केवल GET को स्वीकार करने के रूप में चिह्नित है।

तो यह फिक्स सरल था:

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

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


1
अगर कोई url रूटिंग का उपयोग कर रहा है, तो [मार्ग ("{programmeId = programmeId: int}") की तरह प्रयास करें
sree

1
यह मेरे लिए था। WebApiConfig -> MapHttpRoutes में था -> मार्गटेम्पलेट: "एपीआई / {नियंत्रक} / {आईडी}", इसलिए 'आईडी' के एक पैरामीटर का उपयोग किया जाना था।
हॉकी

1
आपके उत्तर ने मुझे मेरी समस्या की ओर इशारा किया जो थोड़ा अलग था मैंने विधि के लिए एक [FromUri] पैरामीटर का नाम बदल दिया और इसे ग्राहक पक्ष पर अद्यतन नहीं किया
Matus

21

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

using System.Web.Http;

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


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

15

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

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

        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 कोडप्लेक्स प्रोजेक्ट, http://aspnetwebstack.codeplex.com/workitem/184 पर लॉग इन किया गया एक समस्या है । यदि यह कुछ ऐसा है जिसे आप देखना चाहते हैं, तो कृपया इस मुद्दे पर वोट करें।


8

ओपी के समान सेटअप है। कई कार्यों के साथ एक नियंत्रक ... कम "गड़बड़" :-)

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

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

6

ऊपर के रूप में एक ही समस्या है, लेकिन काफी अलग जड़। मेरे लिए, यह था कि मैं एक https rewrite नियम के साथ एक समापन बिंदु मार रहा था। HTTP पर इसे हिट करने से त्रुटि हुई, जैसा कि https के साथ अपेक्षित था।


3

इस कोड में निम्न कोड बदलें

पथ:

App_Start => WebApiConfig.cs

कोड:

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

1

मुझे नहीं पता कि यह ओपी के पद से संबंधित हो सकता है लेकिन मुझे [HttpGet] एनोटेशन याद आ रहा था और जो त्रुटि पैदा कर रहा था, जैसा कि @dinesh_ravva विधियों द्वारा कहा गया है कि इसे डिफ़ॉल्ट रूप से Httpost कहा जा रहा है।


0

मेरा मुद्दा उतना ही सरल था जितना कि एक अशक्त संदर्भ था जो लौटे संदेश में नहीं दिखा, मुझे इसे देखने के लिए अपने एपीआई को डीबग करना पड़ा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.