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

时间:2023-03-08 23:55:42
细说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消息处理管道的入口,翻看源码我们就可以验证:

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

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

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

细说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();
}
}
}

浏览器查看:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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