ASP.NET Web API 框架研究 Web Host模式下的消息处理管道
寄宿的作用是开启一个进程为Web API提供一个运行环境以解决持续监听、请求监听和响应回复,即将接收到的请求转换成HttpRequestMessage对象传入管道,并将管道生成并经过处理后的HttpResponseMessage回复给客户端。寄宿模式分两种,即Web Host模式和Self Host模式,不同模式下采用的机制不一样,我们先来看看Web Host模式下的消息处理管道。
由前几篇可知,在Web Host模式下,是开启一个ASP.NET Web应用作为Web API的宿主,它借助ASP.NET自身的管道结合IIS解决持续监听、请求接收和响应回复,虽然ASP.NET Web API有自己的路由系统,而且在消息处理管道末端的处理器HttpRoutingDispatcher也具有WebAPI自身的路由解析功能,但采用的还是ASP.NET的路由解析功能,其是利用ASP.NET管道中名称为UrlRoutingModule的ASP.NET的HttpModule来完成,通过注册HttpAppliction的PostResolveRequestCache事件来对请求进行拦截,在其事件处理程序中,借助注册的路由对请求URL进行解析得到路由变量并创建RouteData对象,再从匹配的Route对象中获取对应HttpHandler,而在Web Host模式下往Web API路由表中注册一个HttpRoute对象时候,自动会在ASP.NET路由系统的路由表中注册一个HttpWebRoute类型的Route对象,而HttpWebRoute的RouteHandler固定默认指定为HttpControllerRouteHandler,其GetHandler方法创建并返回 返回一个名为HttpControllerHandler的HttpHandler,GetHandler方法的参数是封装了请求上下文和解析出来的路由数据的RequestContext对象,回l顾下ASP.NET 路由那篇的代码,如下图:
那为啥是这个HttpControllerRouteHandler和HttpControllerHandler呢,回顾下Web Host模式下的路由那篇的代码,如下图 :
以及
而这个HttpControllerHandler会将请求接入到消息处理管道,ASP.NET路由系统就是通过其把ASP.NET管道与ASP.NET Web API消息处理管道进行连通,在其构造函数中,指定了解析的路由数据RouteData,以及GlobalConfiguration提供的默认指定的消息处理管道第一个处理器HttpServer,再看如下代码片段:
以及GlobalConfiguration的代码段:
而HttpControllerHandler的处理方法ProcessRequestAsync起到核心作用,主要有以下几点
- 创建HttpRequestMessage对象
- 把路由数据存放到HttpRequestMessage对象的属性字典中
- 执行HttpServer的SendAsync方法,启动消息处理管道
进入消息处理管道后第一个处理器是HttpServer,我们再回过头看下GlobalConfiguration的创建HttpServer的代码,
而在HttpServer调用SendAync方法时候,会先根据HttpConfiguration里的所有自定义处理器集合以及消息管道的最后一个消息处理器HttpRoutingDispatcher通过InnerHandler属性创建好链式的消息处理管道,如下图
然后,调用以下方法启动管道链式处理:
最后,请求到达了管道中的最后一个消息处理器HttpRoutingDispatcher,由上篇已经说明,其主要有两个作用:
- 路由:如果当前请求中不存在路由数据,就会直接解析进而生成封装路由数据的HttpRouteData
- 消息分发:将请求直接分发给在创建时候指定的HttpControllerDispatcher进一步处理
显然,在前边的HttpControllerHandler的处理方法里已经将路由数据存放到了HttpRequestMessage的属性字典中,所以,这里只需要从请求中获取路由数据,而不需要去直接解析,而HttpControllerDispatcher(也是继承自HttpMessageHandler)是在HttpRoutingDispatcher的构造函数中默认指定的,后续的HttpController激活、Action的执行等操作都是它来执行。
ASP.NET Web API 框架研究 Web Host模式下的消息处理管道的更多相关文章
- ASP.NET Web API 框架研究 Self Host模式下的消息处理管道
Self Host模式下的ASP.NET Web API与WCF非常相似,都可以寄宿在任意类型的托管应用程序中,宿主可以是Windows Form .WPF.控制台应用以及Windows Servic ...
- ASP.NET Web API 框架研究 Web Host模式路由及将请求转出到消息处理管道
Web Host 模式下的路由本质上还是通过ASP.NET 路由系统来进行路由的,只是通过继承和组合的方式对ASP.NET路由系统的内部的类进行了一些封装,产生自己专用一套类结构,功能逻辑基本都是一样 ...
- ASP.NET Web API 框架研究 ASP.NET Web API 路由
ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...
- ASP.NET Web API 框架研究 Controller实例的销毁
我们知道项目中创建的Controller,如ProductController都继承自ApiController抽象类,其又实现了接口IDisposable,所以,框架中自动调用Dispose方法来释 ...
- ASP.NET Web API 框架研究 核心的消息处理管道
ASP.NET Web API 的核心框架是一个由一组HttpMessageHandler有序组成的双工消息处理管道:寄宿监听到请求接受后,把消息传入该管道经过所有HttpMessageHandler ...
- ASP.NET Web API 框架研究 ASP.NET 路由
ASP.NET Web API 如果采用Web Host方式来寄宿,在请求进入Web API 消息处理管道之前,就会用ASP.NET 自身的路由系统根据注册的路由表,解析出当前请求的HttpContr ...
- ASP.NET Web API 框架研究 Action方法介绍
在根据请求解析出匹配的Controller类型并创建实例后,要在该Controller类型中的众多Action方法中选择与请求匹配的那一个,并执行,然后返回响应. Action方法,其元数据,主要包括 ...
- ASP.NET Web API 框架研究 服务容器 ServicesContainer
ServicesContainer是一个服务的容器,可以理解为—个轻量级的IoC容器,其维护着一个服务接口类型与服务实例之间的映射关系,可以根据服务接口类型获取对应的服务实例.构成ASP.NET We ...
- ASP.NET Web API 框架研究 IoC容器 DependencyResolver
一.概念 1.IoC(Inversion of Control),控制反转 即将依赖对象的创建和维护交给一个外部容器来负责,而不是应用本身.如,在类型A中需要使用类型B的实例,而B的实例的创建不是由A ...
随机推荐
- 引爆你的Javascript代码进化
转自:http://www.hicss.net/evolve-your-javascript-code/ 方才在程序里看到一段JS代码,写法极为高明,私心想着若是其按照规范来写,定可培养对这门语言的理 ...
- svn 回滚文件修改
取消对代码的修改分为两种情况: 第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [ ...
- 20165213 java学习第一周
20165213 -2018-2<Java程序设计>第一周学习总结 教材学习内容总结 java的四个特点:面向对象.平台无关性.动态性.简单. java编写程序步骤:再有jdk的情况下,先 ...
- [linux]Linux如何查看文件中的中间部分内容
最基本的是cat.more和less. 1. 如果你只想看文件的前5行,可以使用head命令,如: head -5 /etc/passwd 2. 如果你想查看文件的后10行,可以使用tail命令,如: ...
- SyntaxError: missing ; before statement
做分页功能,遇到了很坑的事情.前台一直报错:SyntaxError: missing ; before statement 最后发现解决办法是eval("("+s+")& ...
- 51nod1347 旋转字符串
题目很容易懂,只要进行几次简单的判断就能完成此题,显示判断是否为偶数,之后利用sustr截取两个字符串进行比较,代码如下 #include<iostream> #include<st ...
- create a plugin for PowerShell ISE
可参考:Creating Add-ons, Plugins, and Tools for the PowerShell ISE http://www.leeholmes.com/blog/2013/0 ...
- 利用HBuilder开发基于MUI的H5+ app中使用百度地图定位功能
定位功能有两种方法: 首先要初始化内置地图: var map = new plus.maps.Map("map"); 这里黄色的map是html里面的id: <div id= ...
- IDEA导入MySQL包
点击[Project Structure] 点击[Modules] 在点击下面的界面 找到自己下载的MySQL包就OK了
- log4j介绍和使用
1.apache推出的开源免费日志处理的类库 2.为什么需要日志?? 2.1 在项目中编写system.out.println();输出到控制台,当项目发布到tomcat后,没有控制台(在命令界面能看 ...