ASP.NET Web API中的路由和操作选择
本文介绍ASP.NET Web API如何将HTTP请求路由到控制器上的特定操作。
本文将介绍路由过程的详细信息。如果您创建一个Web API项目并发现某些请求没有按照您期望的方式进行路由,那么本文将有所帮助。
路由有三个主要阶段:
1、将URI与路由模板匹配。
2、选择一个控制器。
3、选择一个动作。
可以使用自己的自定义行为替换流程的某些部分。在本文中,我将描述默认行为。最后,我会注意到您可以自定义行为的位置。
路由模板
路径模板看起来类似于URI路径,但它可以有占位符值,用花括号表示:
"api/{controller}/public/{category}/{id}"
创建路径时,可以为部分或全部占位符提供默认值:
defaults: new { category = "all" }
您还可以提供约束,这些约束限制URI段与占位符匹配的方式:
constraints: new { id = @"\d+" } // Only matches if "id" is one or more digits.
框架尝试将URI路径中的段与模板进行匹配。模板中的文字必须完全匹配。占位符匹配任何值,除非您指定约束。该框架与URI的其他部分不匹配,例如主机名或查询参数。框架选择路由表中与URI匹配的第一个路由。
有两个特殊的占位符:“{controller}”和“{action}”。
“{controller}”提供控制器的名称。
“{action}”提供操作的名称。在Web API中,通常的惯例是省略“{action}”。
默认:如果提供默认值,则路由将匹配缺少这些段的URI。例如:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{category}",
defaults: new { category = "all" }
);
URI“ http://localhost/api/products”匹配此路由。“{category}”段被分配了默认值“all”。
路由词典
如果框架找到URI的匹配项,它将创建一个包含每个占位符的值的字典。键是占位符名称,不包括花括号。值来自URI路径或默认值。字典存储在IHttpRouteData对象中。
在此路由匹配阶段,特殊的“{controller}”和“{action}”占位符将被视为与其他占位符一样。它们只是与其他值一起存储在字典中。
默认值可以具有特殊值RouteParameter.Optional。如果为占位符分配了此值,则该值不会添加到路径字典中。例如:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{category}/{id}",
defaults: new { category = "all", id = RouteParameter.Optional }
);
对于URI路径“api / products”,路由字典将包含:
控制器:“产品”
类别:“全部”
但是,对于“api / products / toys / 123”,路线词典将包含:
控制器:“产品”
类别:“玩具”
id:“123”
默认值还可以包含不会出现在路径模板中任何位置的值。如果路由匹配,则该值存储在字典中。例如:
routes.MapHttpRoute(
name: "Root",
routeTemplate: "api/root/{id}",
defaults: new { controller = "customers", id = RouteParameter.Optional }
);
如果URI路径为“api / root / 8”,则字典将包含两个值:
控制器:“客户”
id:“8”