了解WebApi如何路由请求

时间:2017-02-03 21:33:29

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

我是WebApi的新手,我遵循了本教程https://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

一切都按预期工作 - 我有2个端点

api/products
api/products/id

我想要了解的是它们与我的控制器中定义的方法的关系。

例如,当我点击api / products端点时,运行的动作称为GetAllProducts

当我点击api / products / id端点时,运行的动作称为GetProduct

那么WebApi引擎如何知道将用户引导到这些端点?

我的WebapiConfig.cs是

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

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

控制器:

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 IHttpActionResult GetProduct(int id)
{
    var product = products.FirstOrDefault((p) => p.Id == id);
    if (product == null)
    {
        return NotFound();
    }
    return Ok(product);
}

2 个答案:

答案 0 :(得分:2)

我认为你会发现这个链接很有启发性:

https://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

  

要选择某个操作,请查看以下内容:

     

请求的HTTP方法。

     

路径模板中的“{action}”占位符(如果存在)。

     

控制器上操作的参数。

在你的情况下,它是决定调用哪个方法的最后一个选项 - 正如迈克在评论中所说,它基于签名。

答案 1 :(得分:0)

根据路由的定义方式控制一切...... 正如您所看到的那样,ID参数是可选的..因此,每当您点击请求api / products时 - 您的请求将与路由表匹配,并且它看到ID未通过,这是正常的,因为 它被定义为可选...所以你的方法GetAllProducts被调用....

如果你在url中传递了ID ...你明确地设置了可选的param,它再次与你的路由匹配......因此你得到了指定id的产品细节。