为什么当我尝试将数据发布到WebAPI操作时出现404错误?

时间:2017-01-05 07:18:58

标签: c# jquery asp.net-web-api

当我尝试将数据发布到WebAPI操作时,为什么会出现404错误?

C#:

public class ProductsController : ApiController
{
    [HttpPost]
    public List<Product> GetProductsByCategoryId(int categoryId, string title)
    {
        return new List<Product>
        {
            new Product { Id = 1 , Name = "Test" }
        };
    }
}

jQuery的:

$.ajax({
    url: '/api/products',
    type: 'POST',
    data: {
        categoryId: 12,
        title: 'ABC'
    },
})

image

2 个答案:

答案 0 :(得分:1)

我找到了答案here

  

自从我问这个问题以来,已经有一段时间了。现在我明白了   更清楚的是,我将提供一个更完整的答案来帮助   其他

     

在Web API中,记住参数绑定的方式非常简单   发生。

     
      
  • 如果您POST为简单类型,则Web API会尝试将其与网址绑定
  •   
  • 如果您POST复杂类型,Web API会尝试将其与请求正文绑定(这会使用media-type格式化程序)。

  •   
  • 如果要从网址绑定复杂类型,则会在action参数中使用[FromUri]。这个限制是下降的   您的数据将持续多长时间以及它是否超过网址字符   限制。

         

    public IHttpActionResult Put([FromUri] ViewModel data) { ... }

  •   
  • 如果要从请求正文绑定一个简单类型,您将在action参数中使用[FromBody]。

         

    public IHttpActionResult Put([FromBody] string name) { ... }

  •   
     

作为附注,说你正在发出PUT请求(只是一个字符串)   更新一些东西如果您决定不将其附加到URL并传递   作为模型中只有一个属性的复杂类型,data   jQuery中的参数ajax看起来如下所示。物体   传递给data参数只有一个属性为empty属性   名。

var myName = 'ABC';
$.ajax({url:.., data: {'': myName}});
     

并且您的网络API动作将如下所示。

public IHttpActionResult Put([FromBody] string name){ ... }
     

这个asp.net页面解释了这一切。   http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

     

tnx @Amila

答案 1 :(得分:0)

默认情况下,Web API会尝试从URI中match个简单参数,但您要在正文中提供这些参数。在我原来的回答中,我忘了你不能多次使用FromBodyAttribute。在这种情况下,我创建一个包含值的模型类。然后,Web API会读取这个&#34;复杂的&#34;来自身体的类型。

public class ProductCategoryModel
{
   public int CategoryId { get; set; }
   public string Title { get; set; }
}

public class ProductsController : ApiController
{
    [HttpPost]
    public List<Product> GetProductsByCategoryId(ProductCategoryModel model)
    {
        return new List<Product>
        {
            new Product { Id = 1 , Name = "Test" }
        };
    }
}