细说Asp.Net Web API消息处理管道这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息处理管道的。本文在上篇的基础上进行一个补充,谈谈在WebHost寄宿方式和SelfHost寄宿方式下,请求是如何进入到Asp.Net Web API的消息处理管道的。

WebHost寄宿方式:

剖析Asp.Net WebAPI路由系统一文中,我们知道Asp.Net Web API在WebHost寄宿方式下,最终把HttpControllerHandler类型作为请求的HttpHandler。而又由于Asp.Net Web API以WebHost方式寄宿时,是利用Asp.Net环境里进行请求的处理的。请求在Asp.Net管道事件流转过程中,代表HttpHandler的HttpControllerHandler类型中的ProcessRequestAsync方法将被执行,此方法正是Asp.Net Web API消息处理管道的入口,翻看源码我们就可以验证:

可以看到,在WebHost寄宿方式下,进入Asp.Net Web API消息处理管道的入口是HttpControllerHandler中的ProcessRequestAsync方法,默认使用HttpServer和HttpRoutingDispatcher分作作为消息处理管道的“龙头”和“龙尾”。请求在经过Asp.Net Web API消息处理管道各个节点的处理后,将响应消息逆序流转回HttpControllerHandler中,最后通过Asp.Net将响应消息返回给客户端。

分析完WebHost寄宿方式下如何进入Asp.Net Web API消息处理管道后,下面继续看看SelfHost寄宿方式下是怎样的。

SelfHost寄宿方式:

在继续之前,我们先看Asp.Net Web API以SelfHost方式寄宿的一个例子。新建一个控制台项目,添加名为DemoController的类:

    public class DemoController : ApiController
{
public string Get()
{
return "Asp.Net WebAPI SelfHost";
}
}
    class Program
{
static void Main(string[] args)
{
HttpSelfHostConfiguration configuration = new HttpSelfHostConfiguration("http://localhost:9999/");
using (HttpSelfHostServer server = new HttpSelfHostServer(configuration))
{
server.Configuration.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}"); server.OpenAsync(); Console.Read();
}
}
}

浏览器查看:

现在我们就以这个Demo来开始剖析Asp.Net Web API在SelfHost寄宿方式下,是如何进入消息处理管道的。首先来看看HttpSelfHostConfiguration类型,如下,HttpSelfHostConfiguration继承至HttpConfiguration。在上面实例中,我们通过它来传入了一个地址,此地址将会被用来监听请求:

接下来看一下HttpSelfHostServer源码,如下。HttpSelfHostServer继承至HttpServer,由此看来,HttpSelfHostServer将是Asp.Net Web API消息处理管道的“龙头”:

Asp.Net Web API消息处理管道的“龙尾”,HttpRoutingDispatcher成为SelfHost寄宿方式下消息处理管道的“龙尾”:

根据上面的示例代码,当完成监听端口的置顶、路由的注册后,调用HttpSelfHostServer的OpenAsync方法开始接收请求。那么,在OpenAsync方法内做了什么呢?下面我们来详细看看:

由上面分剖析过程可以知道,在SelfHost寄宿方式下,Asp.Net Web API通过HttpBinding进行请求的监听和响应的回复。继承至HttpServer的HttpSelfHostServer直接作为消息处理管道的“龙头”。在HttpBinding的帮助下,完成请求的监听、请求进入消息处理管道进行处理、响应消息的回复等操作。

至此,Asp.Net Web API在WebHost和SelfHost两种寄宿方式下,请求如何进入消息处理管道的剖析完成。能力有限,如果不对之处,欢迎提出指正。

细说Asp.Net Web API消息处理管道(二)的更多相关文章

  1. ASP.NET Web API消息处理管道:Self Host下的消息处理管道[下篇]

    ASP.NET Web API消息处理管道:Self Host下的消息处理管道[下篇] 我们知道ASP.NET Web API借助于HttpSelfHostServer以Self Host模式寄宿于当 ...

  2. ASP.NET Web API 2系列(二):灵活多样的路由配置

    1. 导言 路由系统是请求消息进入ASP.NET Web API消息处理管道的第一道屏障,其根本目的在于利用注册的路由对请求的URL进行解析以确定目标HTTPController和Action的名称, ...

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

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

  4. ASP.NET Web API的消息处理管道: Self Host下的消息处理管道[上篇]

    ASP.NET Web API的消息处理管道: Self Host下的消息处理管道[上篇] ASP.NET Web API服务端框架核心是一个独立于具体寄宿环境的消息处理管道,它不关心请求消息来源于何 ...

  5. ASP.NET Web API的消息处理管道: HttpRoutingDispatcher

    ASP.NET Web API的消息处理管道: HttpRoutingDispatcher 认情况下,作为消息处理管道“龙头”的HttpServer的Dispatcher属性返回一个HttpRouti ...

  6. ASP.NET Web API的消息处理管道:"龙头"HttpServer

    ASP.NET Web API的消息处理管道:"龙头"HttpServer 一般来说,对于构成ASP.NET Web API消息处理管道的所有HttpMessageHandler来 ...

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

    寄宿的作用是开启一个进程为Web API提供一个运行环境以解决持续监听.请求监听和响应回复,即将接收到的请求转换成HttpRequestMessage对象传入管道,并将管道生成并经过处理后的HttpR ...

  8. ASP.NET Web API标准的“管道式”设计

    ASP.NET Web API的核心框架是一个消息处理管道,这个管道是一组HttpMessageHandler的有序组合.这是一个双工管道,请求消息从一端流入并依次经过所有HttpMessageHan ...

  9. ASP.NET Web API路由系统:路由系统的几个核心类型

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

随机推荐

  1. LPC1768的看门狗定时器使用

    void wwdg_init(void) { LPC_SC->PCLKSEL0 |= (3<<0);//分频数为八分频 LPC_WDT->WDCLKSEL &= ~(3 ...

  2. lpc1768的rit使用

    LPC1768在系统滴答定时器和通用定时器之外还引入了一个定时器,叫做重复定时器RIT,该定时器只能用于定时操作,带有一个中断,我个人的感觉,这似乎是为了延时函数设计的一个定时器 那么使用该定时器时遵 ...

  3. javascript(3)

    使用javascript改进链接 摘自<javascript基础教程> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans ...

  4. python基础(二)字符串內建函数详解

    字符串 定义:它是一个有序的字符的集合,用于存储和表示基本的文本信息,''或""或''' '''中间包含的内容称之为字符串特性:1.只能存放一个值2.不可变,只能重新赋值3.按照从 ...

  5. Runtime —— 从应用场景说起

    根据平时遇到的情况,通过查资料和自己的理解,对Runtime黑科技进行一次个人的学习总结

  6. Windows录音API学习笔记(转)

    源:Windows录音API学习笔记 Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { W ...

  7. 利用STM32F唯一96bit序列号实现反拷贝加密的源代码公开(转)

    源:利用STM32F唯一96bit序列号实现反拷贝加密的源代码公开 //---------------------------------------------------------------- ...

  8. 【noip】华容道

    描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的 ...

  9. IM 融云 之 列表及封装

    // // ChatListIMViewController.m // testRongCloudIM // // Created by WoodGao on 16/1/8. // Copyright ...

  10. Django 设置cookies与获取cookies.

    在Django里面,使用Cookie和Session看起来好像是一样的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX是您想要取得的东西的 ...