我是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);
}
答案 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的产品细节。