首页 > 代码库 > 细说Asp.Net Web API消息处理管道(二)

细说Asp.Net Web API消息处理管道(二)

      在细说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消息处理管道(二)