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 路由的更多相关文章

  1. 使用ASP.Net WebAPI构建REST服务(二)——路由

    REST并没有像传统的RPC服务那样显式指定了服务器函数的访问路径,而是将URL根据一定的规则映射为服务函数入口,这个规则就称之为路由.Asp.Net WebAPI的路由方式和Asp.Net MVC是 ...

  2. ASP.NET WebApi 路由配置【转】

    一.路由介绍 ASP.NET Web API路由是整个API的入口.我们访问某个资源就是通过路由映射找到对应资源的URL.通过URL来获取资源的. 对于ASP.NET Web API内部实现来讲,我们 ...

  3. ASP.NET WebApi 路由配置

    ASP.NET Web API路由是整个API的入口.我们访问某个资源就是通过路由映射找到对应资源的URL.通过URL来获取资源的. 对于ASP.NET Web API内部实现来讲,我们的请求最终将定 ...

  4. 路由其实也可以很简单-------Asp.net WebAPI学习笔记(一) ASP.NET WebApi技术从入门到实战演练 C#面向服务WebService从入门到精通 DataTable与List<T>相互转换

    路由其实也可以很简单-------Asp.net WebAPI学习笔记(一)   MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一位程序猿,在他MVC程序中, ...

  5. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  6. Asp.Net WebApi核心对象解析(上篇)

    生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...

  7. ASP.NET WebApi 文档Swagger深度优化

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明博客园蜗牛原文地址,cnblogs.com/tdws   写在前面 请原谅我这个标题党,写到了第100篇随笔,说是深度优化,其实也并没有什么深度 ...

  8. ASP.NET WebApi 文档Swagger中度优化

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址:www.cnblogs.com/tdws   写在前面 在后台接口开发中,接口文档是必不可少的.在复杂的业务当中和多人对接的情况下,简 ...

  9. ASP.NET Web API路由系统:路由系统的几个核心类型

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

随机推荐

  1. 可编辑的DIV -编辑器

    找了好多,没几个好用的,都或多或少有问题 目前这个最好用..  不过有一个奇葩的问题,就是要放在"<a></a>"标签里面, js或者jQuery获取  $ ...

  2. 机器学习(Machine Learning)&深度学习(Deep Learning)资料

    <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.D ...

  3. android 开发 - 对图片进行虚化(毛玻璃效果,模糊)

    概述 IPAD,IPHONE上首页背景的模糊效果是不是很好看,那么在 Android中如何实现呢.我通过一种方式实现了这样的效果. 开源库名称:anroid-image-blur 一个android ...

  4. js两种定义函数、继承方式及区别

    一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function ...

  5. archlinux 下 nignx + php 出现 no input file specified

    奇葩的问题,配置 nginx + php + mysql 后,加一个站点: server { listen 80; server_name wei.abc.com; root /www/wei.abc ...

  6. [转]Android dex分包方案

    转载自:https://m.oschina.net/blog/308583 当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装 ...

  7. google chrome set

    "D:\Program Files\Google\Chrome\Application\chrome_bk.exe" --start-maximized --user-data-d ...

  8. Vectoroid

    Use cases Drawing (sketch, illustrations, cartooning, etc). Diagramming (any sort of chart with obje ...

  9. publishing failed with multiple errors

    背景: 1.使用maven package工程 2. 在eclipse中添加server运行时 publishing failed with multiple errors resource is o ...

  10. Android 学习笔记之Volley开源框架解析(四)

    学习内容: 1.NetWorkDispatcher网络请求线程调度... 2.NetWork网络请求抽象类... 3.BasicNetWork网络请求抽象类的具体实现... 4.NetWorkResp ...