1.Global.asax中路由的注册

public class WebApiApplication : System.Web.HttpApplication
{ protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
        //api路由注册
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
} }

2.GlobalConfiguration源码

public static void Configure(Action<HttpConfiguration> configurationCallback)
{
if (configurationCallback == null)
{
throw new ArgumentNullException("configurationCallback");
}
        //执行WebApiConfig.Register方法并传入参数GlobalConfiguration.Configuration
configurationCallback(GlobalConfiguration.Configuration);
GlobalConfiguration.Configuration.EnsureInitialized();
}

(1)参数GlobalConfiguration.Configuration

.public static HttpConfiguration Configuration
{
get
{
return GlobalConfiguration._configuration.Value;
}
}
.private static Lazy<HttpConfiguration> _configuration = GlobalConfiguration.CreateConfiguration(); .private static Lazy<HttpConfiguration> CreateConfiguration()
{
Func<HttpConfiguration> arg_1F_0;
if ((arg_1F_0 = GlobalConfiguration.<>c.<>9__11_0) == null)
{
arg_1F_0 = (GlobalConfiguration.<>c.<>9__11_0 = new Func<HttpConfiguration>(GlobalConfiguration.<>c.<>9.<CreateConfiguration>b__11_0));
}
return new Lazy<HttpConfiguration>(arg_1F_0);
} .[CompilerGenerated]
[Serializable]
private sealed class <>c
{
public static readonly GlobalConfiguration.<>c <> = new GlobalConfiguration.<>c();
        ....internal HttpConfiguration <CreateConfiguration>b__11_0()
{
          //RouteTable.Routes全局路由变量
HttpConfiguration expr_0F = new HttpConfiguration(new HostedHttpRouteCollection(RouteTable.Routes));
ServicesContainer services = expr_0F.Services;
services.Replace(typeof(IAssembliesResolver), new WebHostAssembliesResolver());
services.Replace(typeof(IHttpControllerTypeResolver), new WebHostHttpControllerTypeResolver());
services.Replace(typeof(IHostBufferPolicySelector), new WebHostBufferPolicySelector());
services.Replace(typeof(IExceptionHandler), new WebHostExceptionHandler(services.GetExceptionHandler()));
return expr_0F;
} }

(2)WebApiConfig.Register方法

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务 // Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}

由参数可知config.Routes为HostedHttpRouteCollection类型

对应MapHttpRoute方法

public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler)
{
if (routes == null)
{
throw Error.ArgumentNull("routes");
}
HttpRouteValueDictionary defaults2 = new HttpRouteValueDictionary(defaults);
HttpRouteValueDictionary constraints2 = new HttpRouteValueDictionary(constraints);
      //1.封装单个路由
IHttpRoute httpRoute = routes.CreateRoute(routeTemplate, defaults2, constraints2, null, handler);
      //2.把路由加入HostedHttpRouteCollection中
        routes.Add(name, httpRoute);
return httpRoute;
}

//1.封装单个路由 routes.CreateRoute方法

public override IHttpRoute CreateRoute(string uriTemplate, IDictionary<string, object> defaults, IDictionary<string, object> constraints, IDictionary<string, object> dataTokens, HttpMessageHandler handler)
{
if (constraints != null)
{
foreach (KeyValuePair<string, object> current in constraints)
{
this.ValidateConstraint(uriTemplate, current.Key, current.Value);
}
}
return new HostedHttpRoute(uriTemplate, defaults, constraints, dataTokens, handler);
}

可知HostedHttpRouteCollection中类型为HostedHttpRoute类型

//2.把路由加入HostedHttpRouteCollection中routes.Add方法

public override void Add(string name, IHttpRoute route)
{
this._routeCollection.Add(name, route.ToRoute());
}

从参数第4步可知_routeCollection为全局变量RouteTable.Routes中

所以webapi中路由的注册实际最后也是注册到RouteTable.Routes全局变量中

3.webapi的routehandler

根据前边可知webapi的路由最后同mvc一样都是注册到全局路由变量中,在路由中通过urlRoutingModule获取请求然后转发到对应的handler中,那么webapi对应的routehandler是什么呢?

(1).从注册的单个路由类HostedHttpRoute中

从注册路由的maphttpRoute方法中

public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults)
{
return routes.MapHttpRoute(name, routeTemplate, defaults, null, null);
} public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints)
{
return routes.MapHttpRoute(name, routeTemplate, defaults, constraints, null);
} public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler)
{
if (routes == null)
{
throw Error.ArgumentNull("routes");
}
HttpRouteValueDictionary defaults2 = new HttpRouteValueDictionary(defaults);
HttpRouteValueDictionary constraints2 = new HttpRouteValueDictionary(constraints);
IHttpRoute httpRoute = routes.CreateRoute(routeTemplate, defaults2, constraints2, null, handler);
routes.Add(name, httpRoute);
return httpRoute;
}

传入的handler参数都为null

在routes.CreateRoute方法中生成HostedHttpRoute调用构造函数时传入的也是null

public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler)
        {
           .....
      //1.封装单个路由
            IHttpRoute httpRoute = routes.CreateRoute(routeTemplate, defaults2, constraints2, null, handler);
       .....
        }
public override IHttpRoute CreateRoute(string uriTemplate, IDictionary<string, object> defaults, IDictionary<string, object> constraints, IDictionary<string, object> dataTokens, HttpMessageHandler handler)
{
   .......
    return new HostedHttpRoute(uriTemplate, defaults, constraints, dataTokens, handler);
}

HostedHttpRoute的构造函数

public HostedHttpRoute(string uriTemplate, IDictionary<string, object> defaults, IDictionary<string, object> constraints, IDictionary<string, object> dataTokens, HttpMessageHandler handler)
{
RouteValueDictionary defaults2 = (defaults != null) ? new RouteValueDictionary(defaults) : null;
RouteValueDictionary constraints2 = (constraints != null) ? new RouteValueDictionary(constraints) : null;
RouteValueDictionary dataTokens2 = (dataTokens != null) ? new RouteValueDictionary(dataTokens) : null;
this.OriginalRoute = new HttpWebRoute(uriTemplate, defaults2, constraints2, dataTokens2, HttpControllerRouteHandler.Instance, this);
this.Handler = handler;
}

hostedHttpRoute中的getdata通过调用OriginalRoute属性获取对应的routedata.

综上:webapi对应的routehandler为HttpControllerRouteHandler

可知:webapi对应的routehandler为httpControllerRouteHandler

4 webapi对应的handler

从httpControllerRouteHandler中

protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new HttpControllerHandler(requestContext.RouteData);
}

获得HttpControllerHandler.

mvc5中webapi的路由的更多相关文章

  1. Asp.Net Web API 2第八课——Web API 2中的属性路由

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 路由就是Web API如何 ...

  2. 【转】MVC5中的区域(Areas)

    MVC本身提倡的就是关注点分离.但是当项目本身的业务逻辑足够复杂,如果所有的业务逻辑都写个Controller文件夹下面的时候,你会看到非常庞大的各种命名的Controller,这个时候区域的作用就非 ...

  3. Web API 2中的属性路由

    Web API 2中的属性路由 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.ht ...

  4. MVC5中Model层开发数据注解 EF Code First Migrations数据库迁移 C# 常用对象的的修饰符 C# 静态构造函数 MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上) MVC 的HTTP请求

    MVC5中Model层开发数据注解   ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证( ...

  5. ASP.NET Web API WebHost宿主环境中管道、路由

    ASP.NET Web API WebHost宿主环境中管道.路由 前言 上篇中说到ASP.NET Web API框架在SelfHost环境中管道.路由的一个形态,本篇就来说明一下在WebHost环境 ...

  6. ASP.NET Web API Selfhost宿主环境中管道、路由

    ASP.NET Web API Selfhost宿主环境中管道.路由 前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这 ...

  7. MVC5中后台提供Json,前台处理Json,绑定给Dropdownlist的例子

    MVC5中后台提供Json,前台处理Json,绑定给Dropdownlist的例子: 前端: 我们以前在前端定义了两个控件: <div class="row"> < ...

  8. 【读书笔记】Ninject 在MVC5中的使用

    从MVC3中就开始接触Ninject这个IOC工具.也一直是MVC Framework系列书籍中推荐的IOC工具,当然还有优秀的Autofac等.性能和使用上面个有千秋.下面先看一下Ninject的使 ...

  9. ASP.NET Web API 2 中的属性路由使用(转载)

    转载地址:ASP.NET Web API 2 中的属性路由使用

随机推荐

  1. dstat 系统监控命令

    tat 命令很强大,可以实时监控CPU,磁盘,网络,IO,内存等. yum install -y dstat 例: dstat  #查看全部监控信息 dstat -c  #查看cpu 使用情况

  2. Python环境安装与基础语法(4)——内存管理、if分支

    Python内存管理 python中有自动清理内存垃圾的功能,当变量的引用计数为0,则可以被有计划的垃圾回收GC 常量会在系统中被多次引用,所以常量的引用计数无法确定 程序控制 顺序:按照先后顺序逐条 ...

  3. jquery 监听不起效果的小问题汇总

    在写前端页面时,因为我是用jquery添加新的html字符串来实现动态添加.删除,每次新添加都需要生成新的id,当我对新的id进行监听时,却不起作用. 思考了很多方法,开始我以为,如果将监听的语句$( ...

  4. c# 第一节 .net与c#区分

    本节内容: 三个概念:1:.net 和c# 区分2:c# 可以做的事情3:.net 的两种交互模式 1:.net 和c# 区分 .net 一般指.Net Framework框架,是Microsoft为 ...

  5. 201871010135 张玉晶《面向对象程序设计(java)》第十三周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/zyja/p/11918 ...

  6. TortoiseSVN客户端(七)

    TortoiseSVN 是一个 Windows 下的版本控制系统 Apache™ Subversion®的客户端工具. 一.安装 官网下载地址:https://tortoisesvn.net/down ...

  7. TCP协议的粘包问题(八)

    一.什么是粘包 在socket缓冲区和数据的传递过程介绍中,可以看到数据的接收和发送是无关的,read()/recv() 函数不管数据发送了多少次,都会尽可能多的接收数据.也就是说,read()/re ...

  8. AWS云部署项目——数据库与服务器

    1.连接数据库 选择服务RDS,进入后点击数据库实例,在之前建好的数据库内进行操作 首先是安全组,类似于aws云上的防火墙一样的东西,先设置好公开性,安全组置为default(就是尽量避免测试时访问阻 ...

  9. ajax与重定向

    网上有不少说法ajax的请求url浏览器不会重定向的说法是片面的,正常是这样的: 当服务器将302响应发给浏览器时,浏览器并不是直接进行ajax回调处理,而是先执行302重定向——从Response ...

  10. nowcoder911J 异或的路径

    题目链接 题意 给出一棵树,每条边有边权.求\(\sum\limits_{i=1}^n{f(i,j)}\),\(f(i,j)\)表示从i到j路径的异或和. 思路 \(g_i\)表示从根到\(i\)的异 ...