在这篇文章中,通过翻看源码和实例验证的方式,我们知道了Asp.Net Web API消息处理管道的组成类型以及Asp.Net Web API是如何创建消息处理管道的。本文在上篇的基础上进行一个补充,谈谈在WebHost寄宿方式和SelfHost寄宿方式下,请求是如何进入到Asp.Net Web API的消息处理管道的。
WebHost寄宿方式:
在一文中,我们知道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两种寄宿方式下,请求如何进入消息处理管道的剖析完成。能力有限,如果不对之处,欢迎提出指正。