ASP.NET WebAPI 07 路由
WebAPI的中路由设计与ASP.NET相似,但又是独立的一套框架。
HttpRoute
HttpRoute主要提供了路由模板,用于匹配url,生成virtualPath.
public interface IHttpRoute
{ IDictionary<string, object> Constraints { get; } IDictionary<string, object> Defaults { get; } string RouteTemplate { get; } IHttpRouteData GetRouteData(string virtualPathRoot, HttpRequestMessage request); IHttpVirtualPathData GetVirtualPath(HttpRequestMessage request, IDictionary<string, object> values);
}
在HttpRoute中我们可以看到RouteTemplate是用于定义路由模板。在RouteTemplate中所有带大括号的数据都会作为路由变量,而路由就是url与路由变量的匹配。
比如:
api/{controller}/{action}/{id}
这个RouteTemplate包含三个路由变量:controller,action,id
另外对于IHttpRoute 的其它几个属性与方法都是围绕路由变量展开的。
Defaults:
这个属性用于设置路由变量的默认值。
比如:
HttpRouteValueDictionary defaults = new HttpRouteValueDictionary();
defaults.Add("controller", "Demo");
defaults.Add("action","Get");
HttpRouteConstraint
除了进行参数匹配外,WebAPI还提供了参数格式的匹配:
public interface IHttpRouteConstraint
{
bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection);
}
在IHttpRouteConstraint只定义一个Match方法。方法的第一个参数request即被验证的请求。第二个参数为HttpRouteConstraint所在的HttpRoute对象。第四个参数是Route匹配出来所有的路由变量与路由变量值。第五个参数是验证的方向(即是用于请求url的验证,还是对生成url的验证)。
对于第三个参数parameterName,则可能有两种解释:1.路由变量,2.仅仅是一个标识。对于 第一种情况大家应该好理解。对于第二种情况,我们可以用HttpMethodConstraint作为例子。
HttpMethodContraint是对请求方法的一种限制验证,他不对应任何路由变量。所以这个时候parameterName仅仅只是一个标识。
我们再看一下HttpRoute的Constraints属性。它是IDictionary<string, object>类型。其实string对应的就是就是参数parameterName,object对应的是HttpRouteContraint.
WebAP提供了一些HttpRouteConstraint派生类。都位于System.Web.Http.Routing.Constraints 命名空间下。
|
类 |
描述 |
|
AlphaRouteConstraint |
约束某个路由参数,使之仅包含小写或大写英文字母 A 到 Z。 |
|
BoolRouteConstraint |
约束某个路由参数,使之仅代表布尔值。 |
|
CompoundRouteConstraint |
按多个子约束来约束路由。 |
|
DateTimeRouteConstraint |
约束某个路由参数,使之仅代表 DateTime 值。 |
|
DecimalRouteConstraint |
约束某个路由参数,使之仅代表小数值。 |
|
DoubleRouteConstraint |
约束某个路由参数,使之仅代表 64 位浮点值。 |
|
FloatRouteConstraint |
约束某个路由参数,使之仅代表 32 位浮点值。 |
|
GuidRouteConstraint |
约束某个路由参数,使之仅代表 Guid 值。 |
|
IntRouteConstraint |
约束某个路由参数,使之仅代表 32 位整数值。 |
|
LengthRouteConstraint |
将路由参数约束为具有给定长度的或者位于给定长度范围内的字符串。 |
|
LongRouteConstraint |
约束某个路由参数,使之仅代表 64 位整数值。 |
|
MaxLengthRouteConstraint |
将路由参数约束为有一个最大长度的字符串。 |
|
MaxRouteConstraint |
将路由参数约束为有一个最大值的整数。 |
|
MinLengthRouteConstraint |
将路由参数约束为有一个最大长度的字符串。 |
|
MinRouteConstraint |
将路由参数约束为有一个最小值的长型值。 |
|
OptionalRouteConstraint |
根据在可选参数设置为默认值时不会失败的内部约束来约束路由。 |
|
RangeRouteConstraint |
将路由参数约束为给定值范围内的某个整数。 |
|
RegexRouteConstraint |
约束某个路由参数以匹配正则表达式。 |
HttpRouteData
HttpRoute的GetRouteData返回路由匹配及验证成功后的结果,即HttpRouteData。
当然HttpRoute中只会包含匹配成功的路由变量。
public interface IHttpRouteData
{
IHttpRoute Route { get; }
IDictionary<string, object> Values { get; }
}
其中Route是进行匹配的Route,Values是匹配成功的路由变量的字典。
HttpRouteCollection
HttpRouteCollection主要功能是存储HttpRoute,再根据HttpRequestMessage查找出HttpRoute.
HttpRouteCollection提供了MapHttpRoute方法用于添加HttpRoute当然我们也可以直接使用Add方法
public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate); public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults); public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints); public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler);
在进行HttpRoute查找的过程过HttpRoute会逐一HttpRoute进行匹配。直到找到对应的HttpRoute。
在HttpRoute匹配与HttpRouteConstraint验证的过程中只要未得到正确结果都将返回404 NOT FOUND
路径生成
在IHttpRouteConstraint.Match方法中的第五个参数(routeDirection)是验证的方向,除了对请求的url进行匹配处,还可以按照HttpRoute生成url。现在我们看下HttpRouteDirection
public enum HttpRouteDirection
{
UriResolution = 0,
UriGeneration = 1,
}
UriResolution与UriGeneration分别表示Uri解析与生成。HttpRoute也提供了一个GetVirtualPath用于生成Uri。
IHttpVirtualPathData GetVirtualPath(HttpRequestMessage request, IDictionary<string, object> values);
values.Add(HttpRoute.HttpRouteKey, true);
如果我们去调用GetVituralPath可能需要在values参数中添加一个<HttpRoute.HttpRouteKey,true>项
特性路由
对于上述的路由设置是全局的,另外WebAPI还提供了特性路由用于对Action的路由设置。
WebAPI提供了RouteAttribute来标识特性路由。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public sealed class RouteAttribute : Attribute, IDirectRouteFactory, IHttpRouteInfoProvider
{
public string Name { get; set; }
public int Order { get; set; }
public string Template { get; }
}
通过Template属性我们可以直接给路由模板。
另外WebApi还提供了一个用于路由前缀的特性标识:RoutePrefixAttribute。RouteAttrbute与RoutePrefixAttribute合并起来就是一个完整的路由。(当然前缀里面是不能包含路由变量的)
特性路由的注册
特性路由也存储在HttpRouteCollection中,但是WebAPI采用RouteCollectionRoute进行路由存储,所以数据特性路由都以MS_attributerouteWebApi的name存储在HttpRouteCollection中,对于这点,因为RouteCollectionRoute是一个internal类,所以这里我就不扩展了。
特性路由的注册与HttpConfiguration的扩展方法MapHttpAttributeRoute执行。
特性路由的约束
特性路由也为我们提供了路由变量约束的功能,它是通过表达示的方式来进行的。
比如
[Route("Attr/Add/{a:int}/{b:int}")]
这个时候a,b两个路由变量都加上了IntRouteConstraint.
下面是WebAP提供了约束列表:
|
约束类型 |
HttpRouteConstraint类型 |
|
bool |
BoolRouteConstraint |
|
datetime |
DateTimeRouteConstraint |
|
decimal |
DecimalRouteConstraint |
|
double |
DoubleRouteConstraint |
|
float |
FloatRouteConstraint |
|
guid |
GuidRouteConstraint |
|
int |
IntRouteConstraint |
|
long |
LongRouteConstraint |
|
alpha |
AlphaRouteConstraint |
|
regex |
RegexRouteConstraint |
|
max |
MaxRouteConstraint |
|
min |
MinRouteConstraint |
|
range |
RangeRouteConstraint |
|
maxlength |
MaxLengthRouteConstraint |
|
minlength |
MinLengthRouteConstraint |
|
length |
LengthRouteConstraint |
源码
Github: https://github.com/BarlowDu/WebAPI (API_7)
ASP.NET WebAPI 07 路由的更多相关文章
- 使用ASP.Net WebAPI构建REST服务(二)——路由
REST并没有像传统的RPC服务那样显式指定了服务器函数的访问路径,而是将URL根据一定的规则映射为服务函数入口,这个规则就称之为路由.Asp.Net WebAPI的路由方式和Asp.Net MVC是 ...
- ASP.NET WebApi 路由配置【转】
一.路由介绍 ASP.NET Web API路由是整个API的入口.我们访问某个资源就是通过路由映射找到对应资源的URL.通过URL来获取资源的. 对于ASP.NET Web API内部实现来讲,我们 ...
- ASP.NET WebApi 路由配置
ASP.NET Web API路由是整个API的入口.我们访问某个资源就是通过路由映射找到对应资源的URL.通过URL来获取资源的. 对于ASP.NET Web API内部实现来讲,我们的请求最终将定 ...
- 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换
路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- Asp.Net WebApi核心对象解析(上篇)
生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...
- ASP.NET WebApi 文档Swagger深度优化
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明博客园蜗牛原文地址,cnblogs.com/tdws 写在前面 请原谅我这个标题党,写到了第100篇随笔,说是深度优化,其实也并没有什么深度 ...
- ASP.NET WebApi 文档Swagger中度优化
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws 写在前面 在后台接口开发中,接口文档是必不可少的.在复杂的业务当中和多人对接的情况下,简 ...
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
随机推荐
- 在 sublime text 3 中添加 Emmet (ZenCoding)
安装 Emmet 插件: 启动 Sublime Text 3,选择 Preferences>Package Control,点选 Package Control:Install Package: ...
- [转载]在 JavaScript 中判断“空值”
http://lync.in/check-empty-value-in-javascript/ 有时候我们会遇到这样的情况:在一些前端控件要提交数据到服务器端的数据验证过程中,需要判断提交的数据是否为 ...
- ImageSource的使用
很多时候,我们会使用图片来装饰UI,比如作为控件背景等.而这些图片可以分为两种形式,即存在于本地文件系统中的图片和存在于内存中的图片对于这两种形式的图片,在WPF中,使用方法不同,下面主要说明针对这两 ...
- QTP对象管理
QTP对象库管理 - 动态绑定对象库文件:http://blog.csdn.net/testing_is_ ... le/details/20569843 用ObjectRepositoryUtil动 ...
- [转]优秀Python学习资源收集汇总
Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块.与Scheme.Ruby.Perl ...
- sql server 2008安装过程中服务器配置出错
请选择:对所有 SQL Server 服务使用相同的账号: 但这里不能给他设置自己定义的账号和密码 ( 例如下面设置它的账号为 sa ,密码为 654321) 就会发生错误:
- 实战:ajax带参数请求slim API
restful api 支持get,post,put,delete等方法,那么jquery客户端怎么去实现呢?涉及到跨域又怎么办? 很多时候需要传递一个token(api_key) 去识别用户身份,获 ...
- wow7.1 xd 新手教程
本人第一次录游戏视频,很多地方说错了 第一节说奶量百万,其实是十万 目前上传去百度云,录了奶德,跟猫德 [https://pan.baidu.com/s/1jIsLlg6]
- 用C#实现修改网页数据
背景 由于某宝最近升级,导致朋友买的刷单软件不能用了:在又付过钱之后,那个刷单软件供应商竟然捐款跑路了...于是,朋友委托我做一个功能一样的软件.功能 他给我描述的软件功能,是这个样子的: ...
- Lua和C语言的交互——C API
Lua可作为扩展性语言(Lua可以作为程序库用来扩展应用的功能),同时也是个可扩展的语言(Lua程序中可以注册由其他语言实现的函数). C和Lua交互的部分称为C API.C API是一个C代码与Lu ...