带参数的webapi post方法不起作用

时间:2015-12-23 22:32:16

标签: c# ajax post asp.net-web-api

当我调用包含带NO参数的post方法的webAPI控制器时,它会转到该方法。但是,当我传递参数时(以及当我用参数更新api控制器时),请参阅第一个片段下方的片段,我得到405错误,它不支持POST。

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 }
        );

是不是因为我没有解决方案并且回答params(在我的WebApiConfig中)它没有识别它们?

我做错了什么?

7 个答案:

答案 0 :(得分:7)

这是一种稍微不同的设置路线的方法,但我更喜欢它。 在您的控制器代码中,为每个代表GET请求POST的方法添加路由前缀和路由......

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

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

    }
}

只要您正确设置路径,使用正确键入的参数并返回正确键入的值,这应该可以正常工作。如果使用模型,则不必将参数添加到路径路径中。

当我设置我的WebAPI时,这对我有用。如果有人发现任何错误的解释,请告诉我。我还在学习(而且永远都是),但只是想让你知道我做了什么有用。

答案 1 :(得分: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;
}

答案 2 :(得分:3)

添加另一个 MapHttpRoute ,它将接受' 解决方案'和' 回答'作为参数

示例:

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

答案 3 :(得分:2)

[HttpPost]

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

data: JSON.stringify(jsondata)更改为data : jsondata

答案 4 :(得分:1)

它不起作用的原因是因为没有路由会在[post]地址接受2参数 - api / captcha /。

您有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();
}

答案 5 :(得分:1)

根据www.asp.net,

“当HTTP方法配置为在服务器上使用,但已针对给定URI禁用时,服务器将以HTTP 405 Method Not Allowed错误响应。”

进一步参考405

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

答案 6 :(得分:1)

您必须从请求中删除JSON.stringify(数据),然后在模型前添加[FromBody]。然后它会工作。