C# 了解WebApi如何路由请求
我是WebApi新手,我遵循了本教程 一切正常-我有两个端点C# 了解WebApi如何路由请求,c#,asp.net-web-api,C#,Asp.net Web Api,我是WebApi新手,我遵循了本教程 一切正常-我有两个端点 api/products api/products/id 我试图理解的是它们与控制器中定义的方法的关系 例如,当我点击api/products端点时,运行的操作称为GetAllProducts 当我点击api/products/id端点时,运行的操作称为GetProduct 那么WebApi引擎如何知道如何将用户引导到这些端点呢 我的WebapiConfig.cs是 public static void Register(HttpC
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);
}
Product[]产品=新产品[]
{
新产品{Id=1,Name=“番茄汤”,Category=“杂货”,Price=1},
新产品{Id=2,Name=“Yo”,Category=“Toys”,Price=375万},
新产品{Id=3,Name=“Hammer”,Category=“Hardware”,Price=16.99M}
};
公共IEnumerable GetAllProducts()
{
退货产品;
}
公共IHttpActionResult GetProduct(int id)
{
var product=products.FirstOrDefault((p)=>p.Id==Id);
如果(产品==null)
{
返回NotFound();
}
返回Ok(产品);
}
一切都由路由的定义来控制。。。
正如您所看到的,ID参数是可选的。。因此,每当您点击请求api/产品时,您的请求将与路由表匹配,并且它会看到ID未传递,这是正常的,因为
它被定义为可选的。。。因此您的方法GetAllProducts被调用
然而,如果您在url中传递ID。。。您正在明确设置可选参数,该参数再次与您的路由匹配。。。这样,您就可以获得指定id的产品详细信息。所有内容都受到控制,因为路由是如何定义的。。。 正如您所看到的,ID参数是可选的。。因此,每当您点击请求api/产品时,您的请求将与路由表匹配,并且它会看到ID未传递,这是正常的,因为 它被定义为可选的。。。因此您的方法GetAllProducts被调用
然而,如果您在url中传递ID。。。您正在明确设置可选参数,该参数再次与您的路由匹配。。。因此,您可以获得指定id的产品详细信息。我想您会发现此链接非常有启发性: 要选择操作,请查看以下内容: 请求的HTTP方法 路由模板中的“{action}”占位符(如果存在) 控制器上操作的参数
在你的例子中,这是最后一个决定调用哪个方法的选项——正如Mike在评论中所说,它是基于签名的。我想你会发现这个链接非常有启发性: 要选择操作,请查看以下内容: 请求的HTTP方法 路由模板中的“{action}”占位符(如果存在) 控制器上操作的参数
在您的情况下,它是决定调用哪个方法的最后一个选项——正如Mike在评论中所说,它基于签名。您可以发布控制器代码吗?我希望它是根据您方法的签名。你有两个端点;一个接受id参数,另一个不接受。控制器中有两个功能;一个接受id参数,另一个不接受。不需要太多的处理能力就可以找到:)。是的,但如果我有其他端点,一个也需要id的端点,它如何知道路由到哪个端点?有没有任何地方可以描述这一点,而不是讽刺?@MikeMcCaughan一点帮助都没有,你没有回答发生了什么事情使它起作用,这是OP想知道的,这是一个好问题。@D.Foley你没有回答……这就是为什么它是一个评论。这是一个基于多年使用ASP.NETWebAPI经验的猜测。事实证明,这是一个正确的猜测。你能发布你的控制器代码吗?我希望它是通过你方法的签名。你有两个端点;一个接受id参数,另一个不接受。控制器中有两个功能;一个接受id参数,另一个不接受。不需要太多的处理能力就可以找到:)。是的,但如果我有其他端点,一个也需要id的端点,它如何知道路由到哪个端点?有没有任何地方可以描述这一点,而不是讽刺?@MikeMcCaughan一点帮助都没有,你没有回答发生了什么事情使它起作用,这是OP想知道的,这是一个好问题。@D.Foley你没有回答……这就是为什么它是一个评论。这是一个基于多年使用ASP.NETWebAPI经验的猜测。事实证明,这是一个正确的猜测。