【问题标题】:webapi post method with parameters doesn't work带参数的webapi post方法不起作用
【发布时间】:2016-03-30 10:09:32
【问题描述】:

当我调用包含没有参数的 post 方法的 webAPI 控制器时,它会转到该方法。但是,当我将参数(以及当我使用参数更新 api 控制器时)传递到此时,请参阅第一个 sn-p 下方的 sn-p,我得到它不支持 POST 的 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 中)它无法识别它们?

我做错了什么?

【问题讨论】:

  • 控制器的邮政编码
  • @jpgrassi - 我更新了控制器代码 - 我还刚刚将参数添加到 Post 方法中
  • @webdad3 你为什么要把数据串起来我认为你不应该data: jsondata 就够了
  • @meda - 尝试了两种方法,得到了同样的错误。
  • 您是否检查了控制台以查看是否记录了任何错误?

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


【解决方案1】:

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

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

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

    }
}

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

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

【讨论】:

    【解决方案2】:

    您必须从请求中删除 JSON.stringify(data),然后在模型前面添加 [FromBody]。然后就可以了。

    【讨论】:

      【解决方案3】:

      根据 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

      【讨论】:

        【解决方案4】:

        它不起作用的原因是因为在您的 [post] 地址 - api/captcha/ 处没有接受 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();
        }
        

        【讨论】:

          【解决方案5】:
          [HttpPost]
          
          public bool Post(Captcha cap)
          {
              return _service.Post();
          }
          

          和

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

          【讨论】:

            【解决方案6】:

            添加另一个 MapHttpRoute,它将接受 'solution' 和 'answer' 作为参数

            样本:

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

            【讨论】:

              【解决方案7】:

              创建模型

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

              【讨论】:

              • 当我这样做时,我进入了控制器,但“cap”为空。
              • 你确定你的 uri 是正确的吗?尝试这样做 var captchURL = "api/captcha";
              • 积极。我也更改了 captchURL,没有任何变化。
              • 尝试删除私有只读ICaptchaService _service;公共验证码控制器(ICaptchaService 服务){ _service = 服务; }
              猜你喜欢
              • 1970-01-01
              • 2016-10-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-04-28
              • 1970-01-01
              • 1970-01-01
              • 2012-09-01
              相关资源
              最近更新 更多