C# 带有参数的webapi post方法不';行不通

C# 带有参数的webapi post方法不';行不通,c#,ajax,post,asp.net-web-api,C#,Ajax,Post,Asp.net Web Api,当我调用我的webAPI控制器时,该控制器包含一个没有参数的post方法,它将转到该方法。但是,当我将参数(以及当我用参数更新api控制器时)传递到这个代码段中时,请参见第一个代码段下面的代码段,我得到了405个错误,它不支持POST var captchURL = "/api/Captcha"; $.ajax({ url: captchURL, dataType: 'json', contentType: 'application/json',

当我调用我的webAPI控制器时,该控制器包含一个没有参数的post方法,它将转到该方法。但是,当我将参数(以及当我用参数更新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();

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

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

    }
}
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
是因为我没有解决方案和答案参数(在我的WebApiConfig中),所以它无法识别它们吗

我做错了什么?

创建一个模型

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

添加另一个将接受“解决方案”和“答案”作为参数的MapHttpRoute

样本:

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


data:JSON.stringify(jsondata)
更改为
data:jsondata
这是一种稍微不同的路由设置方法,但我更喜欢它。 在控制器代码中,为每个表示POST of GET请求的方法添加路由前缀和路由

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

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

    }
}
只要正确设置路径、使用正确类型的参数并返回正确类型的值,这项功能就可以正常工作。如果使用模型,则不必将参数添加到管线路径中


这在我设置WebAPI时对我起了作用。如果有人认为解释有什么问题,请告诉我。我仍在学习(并将一直学习),但我只是想让您知道我做了哪些工作。

它不起作用的原因是,在您的[post]地址-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();
}

根据www.asp.net

当一个HTTP方法被配置为在服务器上使用,但它已被给定URI禁用时,服务器将以HTTP 405 method Not Allowed错误响应

关于405的进一步参考


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

从您的controller@jpgrassi-我用控制器代码进行了更新-我还刚刚在帖子中添加了参数method@webdad3为什么要对数据进行字符串化我认为不应该
data:jsondata
isenough@meda-两种方法都尝试了,但都出现了相同的错误。您是否检查了控制台以查看是否存在错误记录了错误吗?当我这样做时,我进入了控制器,但“cap”为空。你确定你的uri是正确的吗?尝试执行以下操作:var captchURL=“api/captcha”;肯定的。我也更改了captchURL,没有任何更改。请尝试删除私有只读ICaptchaService\u服务;公共CaptchaController(ICaptchaService服务){u service=service;}