2012-11-20 9 views
5

से "कोई कार्रवाई नहीं मिली" प्राप्त करना मैं एक डब्ल्यूसीएफ देव हूं, एमवीसी के लिए नया हूं। मेरे डब्ल्यूसीएफ एपीआई को एपीआई कंट्रोलर के रूप में एक एमवीसी एप्लिकेशन में एकीकृत करने की कोशिश कर रहा है (अभी भी बड़ा सवाल है कि यह एक योग्य प्रयास है)।वेबएपी

मैं एक jQuery प्लगइन से अनुरोध किया है:

POST http://localhost:18698/Api/Public/DoAction HTTP/1.1 
.... 
Content-Type: application/json; charset=UTF-8 Accept: 
application/json, text/javascript, */*; q=0.01 

{"myParam":"test"} 

मेरे नियंत्रक इस तरह दिखता है:

config.Routes.MapHttpRoute(
     name: "PublicApi", 
     routeTemplate: "api/{controller}/{action}" 
    ); 

मैं:

public class PublicController : ApiController 
{ 
    [HttpPost] 
    public string DoAction(string myParam) 
    { 
     return "Test"; 
    } 
} 

और, मार्ग टुकड़ा इस तरह दिखता है मुझे यह त्रुटि मिल रही है:

{ 
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:18698/Api/Public/DoAction'.", 
    "MessageDetail": "No action was found on the controller 'Public' that matches the request." 
} 

किसी भी JSON पैरामीटर को स्वीकार नहीं करने वाले तरीके ठीक काम करते हैं, लेकिन जेएसओएन पैरामीटर स्वीकार करने वाले लोग काम नहीं करते हैं। मुझे जटिल JSON को विधियों में पारित करने में सक्षम होना चाहिए। डब्ल्यूसीएफ में, जेएसओएन से वस्तुओं तक अनुवाद डब्ल्यूसीएफ द्वारा मेरे लिए संभाला गया था।

क्या आपको पता है कि मुझे यह त्रुटि क्यों मिल रही है? क्या मैं डब्ल्यूसीएफ में एमवीसी में जटिल जेएसओएन को निर्बाध रूप से पास/प्राप्त करने में सक्षम हूं?

+0

से उपयोग करेगा यदि यह इसे 'एप्लिकेशन/एक्स-www-form-urlencoded' प्रारूप' के रूप में पोस्ट करता है तो यह काम करता है? (बस अपने JSON को अमान्य होने की संभावना से इंकार करना चाहते हैं) – James

+0

मैंने अपना पैराम = टेस्ट सामग्री-प्रकार के साथ एक फॉर्म के रूप में पोस्ट किया है: एप्लिकेशन/एक्स-www-form-urlencoded; charset = UTF-8।वही परिणाम - नियंत्रक – user1044169

+0

पर कोई कार्रवाई नहीं मिली, आपका मार्ग ठीक प्रतीत होता है, 'DoAction' को' पोस्ट' में बदलने का प्रयास करें और '[HttpPost]' विशेषता को हटा दें, क्रिया प्रकार को क्रिया नाम से निहित किया गया है 'ApiController'। – James

उत्तर

6

यदि आप JSON की जांच करते हैं तो आप {"myParam":"test"} भेज रहे थे तो आप देखेंगे कि डारिन क्या बताता है यानी आपको अपनी संपत्ति को शामिल करने के लिए मॉडल की आवश्यकता है। { "MyParam": "परीक्षण"} चलाने निम्नलिखित उपकरण में: http://json2csharp.com/ और आपको मिलता है:

public class RootObject 
{ 
    public string myParam { get; set; } 
} 

स्ट्रिंग के सरल प्रकार हैं डिफ़ॉल्ट रूप से एक के रूप में UrlParameter WebAPI द्वारा इलाज किया गया है के साथ आपकी पिछली विधि हस्ताक्षर (public string DoAction([FromUri]string myFoo) के समान)। आप आप कोड छोड़ने के रूप में यह साबित कर सकते हैं के रूप में है इस यूआरएल काम करना चाहिए:

http://localhost:50381/Api/Public/DoAction?myParam=something 

का उपयोग कर JSON.NET अपने आप पर एक साधारण नेट प्रकार पार्स करने के लिए सक्षम नहीं होगा और इसलिए आप बनाने की जरूरत शरीर serialiser इसे होस्ट करने के लिए एक साधारण मॉडल। इसके बाद यह बॉडी बाइंडर public string DoAction([FromBody]RootObject myFoo)

2

हमेशा की तरह एक दृश्य के मॉडल को परिभाषित करने से शुरू:

public class MyModel 
{ 
    public string MyParam { get; set; } 
} 

फिर अपने नियंत्रक कार्रवाई पैरामीटर के रूप इस दृश्य मॉडल ले लिया है:

<script type="text/javascript"> 
    $.ajax({ 
     url: '@Url.HttpRouteUrl("PublicApi", new { controller = "public", action = "doaction" })', 
     type: 'POST', 
     contentType: 'application/json', 
     data: JSON.stringify({ "myParam": "test" }), 
     sucecss: function (result) { 
      console.log(result); 
     } 
    }); 
</script> 
:

public class PublicController : ApiController 
{ 
    [HttpPost] 
    public string DoAction(MyModel model) 
    { 
     return "Test_" + model.MyParam; 
    } 
} 

अंत में नियंत्रक कार्रवाई आह्वान

टिप्पणी: आप Y में कार्रवाई नाम सहित विश्वसनीय सम्मेलनों का उल्लंघन कर रहे हैं हमारे मार्ग विश्वसनीय मार्गों में आप संसाधनों के साथ काम कर रहे हैं, न कि कार्यों के साथ। तो आपका नियंत्रक उस संसाधन का प्रतिनिधित्व करता है जिसे आप जोड़ रहे हैं और HTTP क्रियाएं आपके द्वारा कॉल किए जा रहे कार्यों का प्रतिनिधित्व करती हैं। तो आप क्लाइंट द्वारा उपयोग किए गए HTTP क्रिया के आधार पर गेट, पोस्ट, पैच और डिलीट जैसे क्रिया नामों का उपयोग करेंगे, रूटिंग इंजन स्वचालित रूप से इसी क्रिया को प्रेषित करेगा।

+1

आरईएसटी उल्लंघन के संबंध में उचित बिंदु ... हालांकि, ओपी ने कभी भी एपीआई के बारे में कुछ भी उल्लेख नहीं किया है। – James

+0

यह काम किया। धन्यवाद। क्या इसका मतलब है कि जेएसओएन पैरामीटर हमेशा एमवीसी में लपेटा जाना चाहिए? (डब्ल्यूसीएफ में, एक विकल्प लपेटा बनाम नंगे था।) इसके अलावा, क्या आप जानते हैं, किसी भी मौके से, जेएसओएन सीरिएलाइज़र एमवीसी क्या उपयोग कर रहा है। एक बार फिर धन्यवाद। – user1044169

+0

@ user1044169 JSON.NET डिफ़ॉल्ट रूप से http://james.newtonking.com/projects/json-net.aspx –