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. 从远程服务器数据库中同步数据到本地数据库 sql server 2008 开启分布

    控制面板\所有控制面板项\管理工具 打开“管理工具――组件服务”,以此打开“组件服务――计算机”,在“我的电脑”上点击右键.在MSDTC选项卡中,点击“安全配置”按钮. 在安全配置窗口中做如下设置: ...

  2. idea启动tomcat失败,1099端口被占用

    今天遇到一个问题,当使用idea启动一个tomat服务的时候,报错:不能连接本地1099端口. /Users/liqiu/soft/develop/apache-tomcat-/bin/catalin ...

  3. 自动化测试管理平台ATMS(V2.0.2_8.19)下载

    自动化测试管理平台ATMS(V2.0.2_8.19)下载 http://www.automationqa.com/forum.php?mod=viewthread&tid=2791

  4. 用Wireshark简单分析HTTP通信

    我们都学过TCP,HTTP的相关概念,本文借助协议分析工具Wireshark,让大家对一些概念眼见为实,权当温故而知新. 场景: 在Client(10.239.196.211)上通过web brows ...

  5. ios 关于文件操作 获取 文件大小

     分类: Apple IPhone2012-06-28 11:31 4664人阅读 评论(0) 收藏 举报 ios语言manager测试c c语言 实现 #include "sys/stat ...

  6. 使用UIKit制作卡牌游戏(一)ios游戏篇

    转自朋友Tommy 的翻译,自己只翻译了第三篇教程. 译者: Tommy | 原文作者: Matthijs Hollemans写于2012/06/29 原文地址: http://www.raywend ...

  7. Android UI开发第四十篇——ScrollTricks介绍

    ScrollTricks是一个开源控件,实现了两个简单功能: 1.Quick Return:向上滑动时,View也向上滑动并且消失,当向下滑动时,View马上出现.例如Google Now的搜索功能. ...

  8. Android中使用自身携带的Junit新建一个测试工程

    1.新建立一个Android工程 package com.shellway.junit; public class Service { public int divide(int a,int b){ ...

  9. android px dp sp

    http://www.zcool.com.cn/article/ZMTUxODQw.html

  10. Unity 全面理解加载和内存管理

    最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Resources.Load,一是通过AssetBundle,其实两者本质上我理解没有什么区别.Resources ...