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. SAP的吐槽来源

    这几天看了 梅林传奇(英国剧) , 封面是 梅林传奇的男主 对着女主 一脸无语的玩着电脑. 原来 看梅林传奇的时候,以为自己看错了,没有理会到这部剧的真谛,是自己不懂得和发现美,为了滚娘从第二季就弃了 ...

  2. RPM 包下载 GCC 4.8安装

    http://ftp.scientificlinux.org/linux/scientific/ http://www.rpmfind.net/linux/rpm2html/search.php?qu ...

  3. SDL安全人员角色定义

    SDL安全人员角色定义 http://www.docin.com/p-819975580.html

  4. WebApp MVC,“不一样”的轻量级互联网应用程序开发框架

    WebApp MVC 这是一个专门开发互联网程序的开发框架,跟之前的<EFW框架>使用情况不一样,EFW主要用于开发行业软件的快速开发:而WebApp又区别与别的MVC框架,比如AspNe ...

  5. NGUI 界面自适应

    关于 NGUI 的界面自动适应不同的手机分辨率,网上已经够多的了.如果你点进了这个网页,推荐一下这一篇吧: http://www.xuanyusong.com/archives/2536 下面是我自己 ...

  6. boi剖析 - 基于webpack的css sprites实现方案

    本文是58到家前端工程化集成解决方案boi的博文系列之一.boi是基于webpack打造的一站式前端工程化解决方案,现已开源Github. 作为前端构建工具不可或缺的一个环节,自动生成css spri ...

  7. DalekJS – 基于 JavaScript 实现跨浏览器的自动化测试

    在 Web 项目中,浏览器兼容以及跨浏览器测试是最重要的也是最费劲的工作.DalekJS 是一个基于 JavaScript(或 Node.js) 的免费和开源的自动化测试接口.它能够同时运行测试一组流 ...

  8. LeetCode-304. Range Sum Query 2D - Immutable

    Description: Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by ...

  9. HTTP状态码大全(转自wiki)

    1xx消息 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试 ...

  10. sqlite3存储格式

    本篇介绍sqlite3数据库文件的存储格式.通过阅读源读源代码可以知道sqlite的设计思想.一个sqlite数据库文件对应着一个数据库.sqlite将数据库文件划分大小一致的存储(以区分内存)页面, ...