2012-03-29 23 views
39

यह एक डुप्लिकेट प्रश्न नहीं है, और समस्या मुझे पागल कर रही है। मुझे सामान्य त्रुटि मिल रही है "नियंत्रक वाई पर एक सार्वजनिक क्रिया विधि एक्स नहीं मिली" जो 404 Not Found देता है। स्क्रीनशॉट आप एक अच्छा विचार देता है:404 - नियंत्रक वाई पर एक सार्वजनिक क्रिया विधि एक्स नहीं मिला था (ActionInvoker.InvokeAction झूठी रिटर्न)

Visual Studio debugging session

छवि दिखाता डिबगर लाइन है कि अपवाद के निष्पादित होने (base.HandleUnknownAction(actionName)) फेंकता से पहले सही रोक दिया है। अब, आप निष्कर्षों में कूदने से पहले, यहां कुछ जानकारी दी गई है:

  1. यह किसी बिंदु पर पूरी तरह से ठीक से काम कर रहा था।
  2. HTTP क्रिया (GET) UpdateCart कार्रवाई (विधि हस्ताक्षर के ऊपर एनोटेशन देखें) द्वारा स्वीकार किया जाना चाहिए।
  3. भेजे गए पैरामीटर अप्रासंगिक हैं: त्रुटि POST, GET और पैरामीटर के किसी भी संयोजन के साथ होती है।
  4. उसी नियंत्रक में अन्य समान कार्य अच्छी तरह से काम करते हैं।
  5. मैंने UpdateCartvirtual के साथ स्क्रीनशॉट लिया, लेकिन virtual को हटाने से कोई फर्क नहीं पड़ता।
  6. स्क्रीनशॉट से पता चलता है कि ActionInvoker.InvokeAction(this.ControllerContext, "UpdateCart") झूठी देता है। निश्चित नहीं है कि मेरे नियंत्रक पर किए गए प्रतिबिंब विधि को नहीं ढूंढ सकते हैं, लेकिन यह सही है !!

मार्ग डिफ़ॉल्ट हैं और वे काम करते हैं, अन्यथा मैं उपरोक्त स्क्रीनशॉट लेने के लिए डीबगर को रोकने में सक्षम नहीं होता।

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Tickets", action = "Index", id = UrlParameter.Optional } 
    ); 

} 

कोई भी विचार बहुत सराहना कर रहे हैं: यहाँ Global.asax.cs से कोड है।

संपादित

एतान ब्राउन के नीचे जवाब सही है: HttpGet और HttpPost परस्पर अनन्य हैं। समाधान इन गुणों को [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)] के साथ प्रतिस्थापित करना था।

+0

आप किसी भी यूआरएल पुनर्लेखन कर रहे हैं? – MikeSW

+0

नहीं। कोई यूआरएल पुनर्लेखन नहीं। ध्यान दें कि डीबगर कितनी दूर है! एक अच्छी तरह से phrased और दस्तावेजी प्रश्न के लिए – Diego

+1

+1। जादू साफ/पुनर्निर्माण समाधान चाल के अलावा अन्य कोई विचार नहीं है। माफ़ कीजिये। – Tommy

उत्तर

58

समस्या यह है कि आप HttpGet और HttpPost दोनों विशेषताएँ निर्दिष्ट कर रहे हैं। यदि आप दोनों को छोड़ देते हैं, तो कार्रवाई दोनों पोस्ट और जीईटी अनुरोध स्वीकार करती है। मेरा अनुमान है कि HttpGet और HttpPost गुण एमवीसी को संबंधित अनुरोध प्रकार की अनुमति देने के लिए संकेत नहीं देते हैं, लेकिन विपरीत प्रकार से इनकार करते हैं। तो [HttpPost] सहित, आप GET अनुरोधों को अस्वीकार कर रहे हैं, और [HttpGet] सहित, आप POST अनुरोधों को अस्वीकार कर रहे हैं ... प्रभावी रूप से सभी अनुरोध प्रकारों को अस्वीकार कर रहे हैं। गुणों को छोड़ दें और यह दोनों प्रकारों को स्वीकार करेगा।

अद्यतन: मैंने अभी एमवीसी स्रोत की जांच की है, और मेरी धारणा सही है। ActionMethodSelector में, यह गुण thusly की जाँच करता है:

if (attrs.All(attr => attr.IsValidForRequest(controllerContext, methodInfo))) { 
    matchesWithSelectionAttributes.Add(methodInfo); 
} 

दूसरे शब्दों में, सभी ActionMethodSelectorAttribute (जो HttpPostAttribute और HttpGetAttribute प्राप्त से) सच लौटना चाहिए के लिए कार्रवाई लागू किया जा करने के लिए।एक या दूसरा हमेशा झूठी वापसी करने जा रहा है, इसलिए कार्रवाई कभी निष्पादित नहीं होगी।

+4

"इस प्रकार" शब्द का प्रयोग करें। Upvoted। –

+0

क्या यह सिस्टम.Web.Http; 'और' System.Web.MVC' का उपयोग कर 'दोनों के लिए समान है? यानी 'System.Web.Http का उपयोग कर;' सिग्नल 'deny' सिग्नल करता है या यह एमवीसी संस्करण के लिए विशिष्ट है? मैं पूछता हूं क्योंकि मैंने अभी एक एपीआई परियोजना और एक सामान्य वेबसाइट प्रोजेक्ट से क्रियाएं ली हैं। वेबसाइट एक जैसा वर्णन करता है जैसा कि आपने वर्णन किया है लेकिन बिना किसी क्रिया के एपीआई प्रोजेक्ट को अब तक कार्रवाई नहीं मिल सकती है (यह दोनों प्राप्त और पोस्ट संलग्न था) ... तो या तो 'System.Web.Http' अलग-अलग कार्य करता है, या कुछ और है यह मेरे मार्ग बाइंडर में कारण बनता है ....: एस –

+0

आपका अनुमान है कि 'HttpGet' और 'HttpPost' विशेषताएँ विपरीत प्रकार से इनकार करने के लिए एमवीसी को संकेत देती हैं, यह बिल्कुल सही नहीं है। किसी भी http क्रिया गुणों को जोड़कर आप संकेत दे रहे हैं कि विधि केवल उस क्रिया का समर्थन करती है। इसलिए सूचीबद्ध पहला निष्पादन निष्पादित करता है और अनुरोध को अस्वीकार करता है यदि यह सही क्रिया नहीं है। यही कारण है कि 'AcceptVerbs' काम करता है, क्योंकि यह एक सूची की अनुमति देता है। –

1

देखें: मेरे मामले में मुझे एक नई कार्रवाई विधि तक पहुंचने का प्रयास करते समय 500 त्रुटि मिल रही थी।

IIS 8.5 विस्तृत त्रुटि - 500.0 - एक सार्वजनिक कार्रवाई विधि 'getwells' था नियंत्रक पर नहीं मिला 'ITVizion.VizionLogs.Widgets.Controllers.MapController'।

मैंने नियंत्रक को एक्शन विधि जोड़ा और आईआईएस में अपडेट किए गए ऐप को "तैनात" कर रहा था।

समस्या: मैं विजुअल स्टूडियो में Debug कॉन्फ़िगरेशन को तैनात कर रहा था और उस विशिष्ट परियोजना को इमारत से अनचेक कर दिया था। यह विजुअल स्टूडियो में इमारत को तेज करना था क्योंकि समाधान में बहुत सारी परियोजनाएं हैं। : डी आईआईएस ऐप फ़ोल्डर में जाकर मैंने देखा कि परियोजना का डीएलएल पुराना था।

तो सुनिश्चित करें कि आप प्रोजेक्ट को बनाने के लिए जांचें। :) यह स्पष्ट रूप से आईआईएस को नए कोडेज़ को तैनात करने का ख्याल रखेगा।

enter image description here

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