寄宿的作用是开启一个进程为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模式下的消息处理管道的更多相关文章

  1. ASP.NET Web API 框架研究 Self Host模式下的消息处理管道

    Self Host模式下的ASP.NET Web API与WCF非常相似,都可以寄宿在任意类型的托管应用程序中,宿主可以是Windows Form .WPF.控制台应用以及Windows Servic ...

  2. ASP.NET Web API 框架研究 Web Host模式路由及将请求转出到消息处理管道

    Web Host 模式下的路由本质上还是通过ASP.NET 路由系统来进行路由的,只是通过继承和组合的方式对ASP.NET路由系统的内部的类进行了一些封装,产生自己专用一套类结构,功能逻辑基本都是一样 ...

  3. ASP.NET Web API 框架研究 ASP.NET Web API 路由

    ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...

  4. ASP.NET Web API 框架研究 Controller实例的销毁

    我们知道项目中创建的Controller,如ProductController都继承自ApiController抽象类,其又实现了接口IDisposable,所以,框架中自动调用Dispose方法来释 ...

  5. ASP.NET Web API 框架研究 核心的消息处理管道

    ASP.NET Web API 的核心框架是一个由一组HttpMessageHandler有序组成的双工消息处理管道:寄宿监听到请求接受后,把消息传入该管道经过所有HttpMessageHandler ...

  6. ASP.NET Web API 框架研究 ASP.NET 路由

    ASP.NET Web API 如果采用Web Host方式来寄宿,在请求进入Web API 消息处理管道之前,就会用ASP.NET 自身的路由系统根据注册的路由表,解析出当前请求的HttpContr ...

  7. ASP.NET Web API 框架研究 Action方法介绍

    在根据请求解析出匹配的Controller类型并创建实例后,要在该Controller类型中的众多Action方法中选择与请求匹配的那一个,并执行,然后返回响应. Action方法,其元数据,主要包括 ...

  8. ASP.NET Web API 框架研究 服务容器 ServicesContainer

    ServicesContainer是一个服务的容器,可以理解为—个轻量级的IoC容器,其维护着一个服务接口类型与服务实例之间的映射关系,可以根据服务接口类型获取对应的服务实例.构成ASP.NET We ...

  9. ASP.NET Web API 框架研究 IoC容器 DependencyResolver

    一.概念 1.IoC(Inversion of Control),控制反转 即将依赖对象的创建和维护交给一个外部容器来负责,而不是应用本身.如,在类型A中需要使用类型B的实例,而B的实例的创建不是由A ...

随机推荐

  1. UIImageView中的UIButton不响应事件解决方案

    如下: CGRect imageRect = (CGRect){, , , }; UIImageView *imageView = [[[UIImageView alloc] initWithFram ...

  2. Python配置工具类ConfigParser使用

    ConfigParser模块定义了类ConfigParser,用于实现配置文件解释器.该模块ConfigParser在Python3中,已更名为configparser. 一,函数介绍 1.读取配置文 ...

  3. 看看用PS来转基因的动物,居然很欢乐!!

    出于礼貌,我先笑一下,哈哈哈哈哈哈!好了,开始.Gyyporama是挪威的一名程序员,他无聊的时候会从网上找来一些动物的图片,把他们的头和身体进行混合,生成另一种奇怪的动物.然后邀请其他网友过来给他们 ...

  4. PS故障风海报制作技术分享

    1.首先找一张看起来很酷的图(也可以选择自己喜欢的图片): 2. 复制图层,点击添加图层样式,选择混合选项,在高级混合里面的通道选项,有R.G.B三个通道选项,默认是全部勾选的状态,选择其中一个勾掉( ...

  5. $(QTDIR);$(QTDIR)\include\QtCore;$(QTDIR)\include;

    $(QTDIR); 在系统环境变量中定义即可  vs属性中设置头文件路径

  6. SQL语句的三大类

    数据定义语言(DDL Data Defination Language):用于创建和定义数据库对象,并且将对这些对象的定义保存到数据库字典中,通过DDL语句可以创建数据库对象.修改数据库对象.删除数据 ...

  7. Netty 源码 Channel(一)概述

    Netty 源码 Channel(一)概述 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) Channel 为 Netty ...

  8. win7 64位远程连接oracle11g64位

    1.首先下载即时客户端 instantclient-basic-windows.x64-11.2.0.4.0,下载地址:http://www.oracle.com/technetwork/topics ...

  9. tomcat优化(转)

    tomcat优化 Activiti  分享牛  2017-02-08  1132℃ 本文重点讲解tomcat的优化. 基本优化思路: 1.         尽量缩短单个请求的处理时间. 2.      ...

  10. SQL Server 2008中的MERGE(不仅仅是合并)

    SQL Server 2008中的MERGE语句能做很多事情,它的功能是根据源表对目标表执行插入.更新或删除操作.最典型的应用就是进行两个表的同步. 下面通过一个简单示例来演示MERGE语句的使用方法 ...