2013-02-28 9 views
5

मैं निम्नलिखित कोड है, लेकिन अनुरोध समाप्त होता है (फू()/बार()) हमेशा No action was found on the controller 'Device' that matches the request.ASP.NET वेबएपीआई - कोई कार्रवाई नहीं मिला था

में मैं अपने WebApiConfig में एक कस्टम मार्ग है:

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

मेरे ASP.NET वेबएपीआई नियंत्रक:

[HttpPost] 
public void UpdateToken(string newToken) 
{ 
    _deviceHandler.UpdateToken(newToken); 
} 

मेरी ASP.NET वेबएपीआई क्वेरी करने के लिए मैं RestSharp उपयोग कर रहा हूँ।

private static void Send(string resource, Method method, object payload) 
{ 
    var client = new RestClient(baseUrl); 
    var request = new RestRequest(resource, method); 
    request.XmlSerializer = new JsonSerializer(); 
    request.RequestFormat = DataFormat.Json; 
    request.AddBody(payload); 

    var response = client.Execute(request); 
    // ... handling response (exceptions, errors, ...) 
} 

public void Foo() 
{ 
    var newToken = "1234567890"; 
    Send("/api/device/updatetoken", RestSharp.Method.POST, newToken); 
} 

public void Bar() 
{ 
    var newToken = new { newToken = "1234567890" }; 
    Send("/api/device/updatetoken", RestSharp.Method.POST, newToken); 
} 

एक ही तरीका है इस त्रुटि से बचने के लिए एक संपत्ति के साथ एक आवरण वर्ग पैदा कर रही है (मिलता है, सेट;) यह जिसमें नियंत्रक तर्क (newToken) के नाम पर है।

मेरे पास बहुत सारे अनुरोध हैं जो पोस्ट के रूप में एक या दो कस्टम स्ट्रिंग (अपरिभाषित लंबाई) भेजते हैं (लंबाई सीमित है)। लेकिन प्रत्येक परिदृश्य के लिए बनाने के लिए एक रैपर कार्यान्वयन असली ओवरहेड है! मैं जाने का एक और तरीका ढूंढ रहा हूं।

पुनश्च: मुझे आशा है कि मैं परिदृश्य को सरल बनाकर कोई गलती नहीं की है =)

उत्तर

12

प्रिमिटिव डिफ़ॉल्ट रूप से URI से बंधे हुए हैं।

[HttpPost] 
public void UpdateToken([FromBody] string newToken) 
{ 
    _deviceHandler.UpdateToken(newToken); 
} 

स्ट्रिंग फिर उपयुक्त फ़ॉर्मेटर का उपयोग कर deserialized नहीं जाएगी: आप एक आदिम शरीर से आना चाहते हैं, तो आप [FromBody] इस तरह विशेषता का उपयोग करना चाहिए। यदि यह JSON है, तो अनुरोध निकाय इस तरह दिखना चाहिए:

"1234567890" 
+0

धन्यवाद, बस गायब [FromBody] -Attribute गलती थी। – dannyyy

+0

यह सिर्फ मेरी रात को बचाया। मैं अपने सिर पर बैंग कर रहा था कि यह एक विशेष मार्ग 404 क्यों प्राप्त कर रहा था। यह एक int लेता है जहां मेरे बाकी मार्ग एक संदर्भ प्रकार लेते हैं। [FromBody] विशेषता को जोड़ना चाल था। – squillman

+0

1 मेरे जीवन के आधे दिन को बचाने के लिए, आधा पहले से ही बर्बाद हो गया धन्यवाद –

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