问题
怎么样限制路由中参数的值。
解决方案
ASP.NET WEB API 允许我们通过 IHttpRouteConstraint 接口设置路由约束。集中式路由和直接式路由都可以使用 IHttpRouteConstraint。
框架提供了 18 个接口,他提供了大部分类型的约束,例如,路由参数长度相关的约束,可以确保值都在定义范围内,或者限制数据类型。当然也可以通过实现接口 IHttpRouteConstraint 来自定义约束逻辑。
工作原理
IHttpRoutConstraint 是一个 HTTP 路由约束接口(如代码片段 3-11),并公开了一个简单的方法 Match,这个方法需要五个参数,HttpRequestMessage 实例,IHttpRoute 实例,string 类型的 parameterName,Idictionary<string,object> 类型的路由 value,HttpRouteDirection 类型的 routeDirection,也是为了保证路由可以基于应用程序的逻辑被匹配到。
代码片段 3-11 IHttpRouteConstraint 定义
public interface IHttpRouteConstraint { bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection); }
也可以通过使用 CompoundRouteConstraint 进行复合约束,需要通过构造函数添加到 IHttpRouteConstraint 集合中,如表格 3-1 所示,展示内建的约束和基本用法
表格 3-1. ASP.NET WEB API 中 IHttpRouteConstraint 可以用的约束
属性路由,是通过 DefaultInlineConstraintResolver 来映射嵌入约束的版本和实际类型。当调用 MapHttpAtrributeRoute 的时候,ASP.NET WEB API 会使用解析器转换嵌入约束为相关 IHttpRouteConstraint 实例。为了采用某些约束处理自定义约束,也可以修改 DefaultInlineConstraintResolver 或者自己实现