管导通信大致原理:
public class HttpListenerServer : IServer { public HttpListener Listener { get; } public HttpListenerServer(string url) { this.Listener = new HttpListener(); this.Listener.Prefixes.Add(url ?? "http://localhost:3721/"); } public void Start<TContext>(IHttpApplication<TContext> application) { this.Listener.Start(); while (true) { HttpListenerContext httpListenerContext = this.Listener.GetContext(); HttpListenerContextFeature feature = new HttpListenerContextFeature(httpListenerContext); FeatureCollection contextFeatures = new FeatureCollection(); contextFeatures.Set<IHttpRequestFeature>(feature); contextFeatures.Set<IHttpResponseFeature>(feature); TContext context = application.CreateContext(contextFeatures); application.ProcessRequestAsync(context) .ContinueWith(_ => httpListenerContext.Response.Close()) .ContinueWith(_ => application.DisposeContext(context, _.Exception)); } } }
ASP.NET Core应用如何利用WebHostBuilder最终构建出请求处理管道的流程以及管道自身处理请求的流程具有了一定的了解,现在我们来做一个简单的总结。请求处理管道涉及到四个核心的对象,它们分别是WebHostBuilder、WebHost、Server和HttpApplication,它们之间具有如图11所示的关系。我们通过WebHostBuilder来创建WebHost,并领用后者来构建请求处理管道。
请求处理管道通过一个Server和一个HttpApplication对象组成,后者是对所有注册的中间件的封装。当WebHost被启动的时候,它会创建Server和HttpApplication对象,并将后者作为参数调用Server的Start方法以启动服务器。启动后的Server开启监听请求并利用HttpApplication来处理接收到请求。当HttpApplication完成了所有请求处理工作之后,它会利用Server完成对请求的最终响应。
上面所述的所有内容都是针对我们自定义的模拟管道来介绍的,虽然我们对这个模拟管道做了极大的简化,但是它依然体现了ASP.NET Core管道处理请求的真实流程,而且真实管道的创建方式也与模拟管道基本一致。如果读者朋友们能够对这个模拟管道具有深刻的理解,我相信对真实管道的把握就会变得非常容易。