【问题标题】:ASP.NET WebAPI throw 404 if method parameter is string or int如果方法参数是字符串或整数,则 ASP.NET WebAPI 抛出 404
【发布时间】:2012-11-29 12:24:16
【问题描述】:

我在 ASP.NET MVC4 WebAPI 上做了一个非常简单的测试,发现了一些有趣的问题:

当一个方法采用复杂类型时,它会工作,但当它采用 string 或 int 时,它会抛出 404,如给出的屏幕截图:“AddProduct”工作,但“Test”和“Test1”总是没找到。

我应该如何正确调用该方法?

【问题讨论】:

    标签: asp.net asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    您需要使用 [FromBody] 属性来装饰您的字符串或 int 参数。

    [HttpPost] 公共字符串测试([FromBody]字符串用户名)

    [HttpPost] public int Test1([FromBody]int value)

    【讨论】:

      【解决方案2】:

      试试这个:

      该网站接受“[FormBody]”的值,因此您应该通过“={0}”发布 ({0} 被您的字符串数据替换)

      $.ajax({
          url: "api/values",
          data: "='hello world'",
          dataType: "text",
          type: "POST",
          success: function (data) {
              $("#result").val(data);
          },
          fail: function (data) {
              alert(data);
          }
      });
      

      另请参阅此答案: POST a string to Web API controller in ASP.NET 4.5 and VS 2012 RC

      【讨论】:

      • 那个 = 符号是一个陷阱,特别是对于最新版本的 Web API 2,如果您将 JSON 字符串发送到 Web API 2 控制器操作并且您有 [FromBody] 参数属性,则始终需要记住那么您需要将 = 符号添加到 JSON 的开头,例如在您的客户端 ajax 调用中,您会将 = 符号连接到要发布的数据的开头
      【解决方案3】:

      你试过了吗,

      $.ajax({
        url : "/api/product/test",
        data : { username : "edi" },
        dataType : "json",
        type : "POST",
        success : function(res){ console.log(res); },
        error : function(req, stat, err){ console.log(stat + ": " + err); }
      });
      

      现在它失败了,因为您已将整个 json 对象(在 jquery ajax 方法中)用引号括起来。

      尝试不带引号并告诉我!

      还有,

      在测试字符串用户名和 int 值等单个变量时,请注意 WEB API 会期望它完全一样。

      这家伙,

      [HttpPost]
      public string Test1(int value) { ... }
      

      将寻找与此 url 签名匹配的帖子(我使用 HTTPIE)...

      $ http POST http://yourwebsite.com/api/test1 value=1

      其中“4”是该 Test1 方法中变量“value”的值。

      在此处了解有关 HTTPIE 的更多信息:Scott Hanselman on installing HTTPIE

      希望有帮助!

      【讨论】:

      • 我发现只要更改方法参数,添加[FromBody],就可以了。比如:公共字符串 Foo([FromBody] string para1)。还是谢谢你的回答~
      【解决方案4】:

      我为此搜索了将近一天,因为我希望我的数据是 JSON,所以假设您需要在此处发布一个值:

      情报:

      $.post('/api/mywebmethod', { "": 10 })
      

      字符串

      $.post('api/mywebmethod', { "": "10" });
      

      控制器

      [HttpPost]
      public IHttpActionResult MyWebMethod([FromBody]int id)
      {
      //do work
      }
      

      【讨论】:

        【解决方案5】:

        使用Route

        [RoutePrefix("api/Product")]
        public class ProductController:ApiController
        {
        [Route("Add"),HttpPost]
        public string AddProduct(Product productModel)
        
        [Route("Test"),HttpPost]
        public string Test(string userName){}
        }
        

        调用: localhost:xx//api/product/Add

        【讨论】:

          猜你喜欢
          • 2013-02-10
          • 2014-03-03
          • 2019-01-12
          • 1970-01-01
          • 2012-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-14
          相关资源
          最近更新 更多