2015-12-23 6 views
5

काम नहीं करती है जब मैं अपना वेबएपीआई नियंत्रक कहता हूं जिसमें कोई पैरामीटर नहीं है, तो यह विधि पर जाता है। हालांकि, जब मैं पैरामीटर पास करता हूं (और जब मैं पैरामीटर के साथ एपीआई नियंत्रक भी अपडेट करता हूं) इसमें पहली स्निपेट के नीचे स्निपेट दिखाई देता है तो मुझे 405 त्रुटि मिलती है कि यह पोस्ट का समर्थन नहीं करता है।पैरामीटर के साथ वेबपी पोस्ट विधि

var captchURL = "/api/Captcha"; 
$.ajax({ 
     url: captchURL, 
     dataType: 'json', 
     contentType: 'application/json', 
     type: 'POST' 
}) 



var jsondata = {solution: "7", answer: "7"}; 
    var captchURL = "/api/Captcha"; 
    $.ajax({ 
      url: captchURL, 
      dataType: 'json', 
      contentType: 'application/json', 
      type: 'POST', 
      data: JSON.stringify(jsondata) 
    }) 

अद्यतन - नियंत्रक कोड:

public class CaptchaController : ApiController 
{ 
    private readonly ICaptchaService _service; 
    public CaptchaController(ICaptchaService service) 
    { 
     _service = service; 
    } 

    public Captcha Get() 
    { 
     return _service.Get(); 
    } 

    [HttpPost] 
    public bool Post(string solution, string answer) 
    { 
     return _service.Post(); 

    } 
} 

अद्यतन - WebApiConfig: क्योंकि मैं समाधान नहीं है और जवाब देने के पैरामीटर (में

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

यह है मेरी WebApiConfig) कि यह उन्हें पहचान नहीं है?

मैं गलत तरीके से क्या कर रहा हूं?

+0

अपने नियंत्रक से पोस्ट कोड – jpgrassi

+0

@jpgrassi - मैंने नियंत्रक कोड के साथ अपडेट किया - मैंने पोस्ट विधि – webdad3

+0

@ वेबडैड 3 में पैरामीटर भी जोड़े हैं, आपने डेटा को स्ट्रिंग क्यों किया है, मुझे लगता है कि आपको डेटा नहीं होना चाहिए: jsondata' पर्याप्त है – meda

उत्तर

6

यह मार्ग निर्धारित करने की एक अलग विधि है, लेकिन मैं इसे पसंद करता हूं। अपने नियंत्रक कोड एक मार्ग उपसर्ग और प्रत्येक विधि कि GET अनुरोध की एक पोस्ट का प्रतिनिधित्व करेगा के लिए मार्गों को जोड़ने में ...

[RoutPrefix("Captcha")] 
public class CaptchaController : ApiController 
{ 

    [Route("Post/{solution}/{answer}")] 
    [HttpPost] 
    public bool Post(string solution, string answer) 
    { 
     return _service.Post(); 

    } 
} 

यह रूप में लंबे समय से काम करना चाहिए के रूप में आप पथ सही ढंग से सेट कर रहे हैं, सही लिखा पैरामीटर्स का उपयोग , और सही ढंग से टाइप किए गए मान को वापस कर रहा है। यदि आप मॉडल का उपयोग करते हैं तो आपको रूट पथ में पैरामीटर जोड़ने की ज़रूरत नहीं है।

यह मेरे लिए काम किया जब मैं अपना वेबएपीआई स्थापित कर रहा था। अगर कोई स्पष्टीकरण के साथ कुछ भी गलत देखता है तो कृपया मुझे बताएं। मैं अभी भी सीख रहा हूं (और हमेशा होगा), लेकिन सिर्फ आपको यह बताना चाहता था कि मैंने क्या किया है।

4

एक मॉडल

public class Captcha { 
    public string solution { get; set; } 
    public string answer { get; set; } 
} 

नियंत्रक बनाने है पैरामीटर के रूप में

इस

[HttpPost] 
public string Post([FromBody] Captcha cap) 
{ 
    return cap.solution + " - " + cap.answer; 
} 
+0

जब मैंने ऐसा किया तो मैं नियंत्रक में गया लेकिन "टोपी" शून्य थी। – webdad3

+0

क्या आप वाकई अपने यूरी सही हैं? इस var captchURL = "api/captcha" करने का प्रयास करें; –

+0

सकारात्मक। मैंने कैप्चरर को बदल दिया और साथ ही कोई बदलाव नहीं किया। – webdad3

3

एक और MapHttpRoute जो 'समाधान' और 'जवाब' स्वीकार करेंगे जोड़े नमूना:

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{solution}/{answer}", 
      defaults: new { solution = RouteParameter.Optional, answer= RouteParameter.Optional } 
     ); 
2
[HttpPost] 

public bool Post(Captcha cap) 
{ 
    return _service.Post(); 
} 

और

बदलें data : jsondata करने के लिए data: JSON.stringify(jsondata)

1

कारण यह काम नहीं करता है क्योंकि ऐसा कोई मार्ग नहीं है जो आपके [पोस्ट] पते पर 2 पैरामीटर स्वीकार करेगा - एपीआई/कैप्चा /।

आप 2 विकल्प हैं, या तो के रूप में

[Route("Post/{solution}/{answer}")] 
[HttpPost] 
public bool Post(string solution, string answer) 
{ 
    return _service.Post(); 

} 

विशेषता नियंत्रक में मार्ग की स्थापना या

Public class CaptchaModel 
{ 
    Public string Solution {get; set;} 
    Public string Answer {get; set;} 
} 

के रूप में एक मॉडल बनाने और अपनी कार्रवाई विधि

[HttpPost] 
public bool Post([FromBody] CaptchaModel model) 
{ 
    var solution = model.solution; 
    var answer = model.answer; 
    ......... 
    return _service.Post(); 
} 
1

में के अनुसार www.asp.net,

"जब सर्वर पर उपयोग के लिए एक HTTP विधि कॉन्फ़िगर किया गया है, लेकिन इसे किसी दिए गए यूआरआई के लिए अक्षम कर दिया गया है, तो सर्वर HTTP 405 विधि अनुमत त्रुटि के साथ प्रतिक्रिया देगा।"

http://www.asp.net/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications

1

पर आगे संदर्भ आप अपने अनुरोध से JSON.stringify (डेटा) को हटाने और फिर सामने अपने मॉडल जोड़ने [FromBody] चाहिए। फिर यह काम करेगा।

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