MVC 4 WebAPI中的操作

时间:2013-08-29 17:02:19

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

我一直关注http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api,在创建了以下控制器之后,我得到了意想不到的结果......

public class ProductsController : ApiController
{
    Product[] products = new Product[] 
    { 
        new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 }, 
        new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M }, 
        new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M } 
    };

    public IEnumerable<Product> GetAllProducts()
    {
        return products;
    }

    public Product GetProductById(int id)
    {
        var product = products.FirstOrDefault((p) => p.Id == id);
        if (product == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        return product;
    }
}

我希望能够像这样打个电话:

  

/ API /产品/ GetAllProducts

但这不起作用。相反,我可以简单地打电话:

  

/ API /产品

GetAllProducts()中描述的程序实际上是这样做的。为什么这不能按预期工作?

2 个答案:

答案 0 :(得分:3)

因为在WebApi框架中,假设你需要“Get”方法。

你熟悉不同的http动词吗?发布,获取,放置,删除?当您在浏览器中键入URL时,它会发出Get请求。框架看到了并假设您想要GetAllProducts。

如果您有DeleteAllProducts,并向/api/products发出删除请求,则会运行该请求。

如果您有GetProduct(int id)并发出了Get请求(例如,通过在浏览器地址栏中键入内容)api/products/1,则会执行GetProcuct(1)

将其视为基于CRUD的控制器。您可以使用名为Get,Post,Put,Delete的操作,它将根据使用的http动词运行。想要更新产品?它类似于public ActionResult Post(int id, [FromBody]Product p),您可以通过对/ api / products / 1的POST请求来调用它。当然,需要在请求体中发送Product Json / XML以使序列化工作。

答案 1 :(得分:1)

使用Url/api/products/GetAllProducts它不起作用,因为您的网络Api仅支持默认路由:

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

为了使其按预期运行,您需要在顶部添加一条支持action的路线:

configuration.Routes.MapHttpRoute(
          name: "CustomizedApi",
          routeTemplate: "api/{controller}/{action}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );

至于第二个URL/api/products,因为:

默认路由中的id是可选的(RouteParameter.Optional)。

来自link

  

框架只选择与请求的HTTP方法(GET,POST,PUT,DELETE)匹配的操作,确定如下:

     
      
  • 具有属性的HTTP方法:AcceptVerbs,HttpDelete,HttpGet,HttpHead,HttpOptions,HttpPatch,HttpPost或HttpPut。

  •   
  • 否则,如果控制器方法的名称以“Get”,“Post”,“Put”,“Delete”,“Head”,“Options”或“Patch”开头,那么按惯例action支持HTTP方法。

  •   
  • 如果不是上述方法,则该方法支持POST。

  •   

在您的情况下,如果您从浏览器发出请求,则它应该是GET请求,因此此请求将映射到以Get开头的操作(方法GetAllProducts