ASP.NET Core程序现在变得如同控制台(Console)程序一般,同样通过Main方法启动整个应用。而Main方法要做的事情很简单,创建一个WebHostBuilder类,调用其Build方法生成一个WebHost类,最后启动之。
实现代码一目了然:
要想探寻其内部究竟做了哪些操作,则需要调查下WebHost类中CreateDefaultBuilder静态方法:
代码稍微有点多,但这里只关心WebHostBuilder类的创建,以及该builder使用了UseKestrel方法。
UseKestrel方法内部通过IoC的方式注入了KestrelServer类:
由此可以知道当一个ASP.NET Core应用程序运行起来时,其内部会有KestrelServer。
那么为什么会需要这个KestrelServer?因为它可以做为一个反向代理服务器,帮助ASP.NET Core实现跨平台的需要。
以传统Windows系统上的IIS为例,如下图所示,ASP.NET Core应用程序中的代码已经不再直接依赖于IIS容器,而是通过KestrelServer这个代理将HTTP请求转换为HttpContext对象,再对此对象进行处理。
图中的ASP.NET Core Module也是由ASP.NET Core的诞生而引入的新的IIS模块。它的主要功能是将Web请求重定向至ASP.NET Core应用程序。并且由于ASP.NET Core应用程序独立运行于IIS工作进程之外的进程,它还负责对进程的管理。
ASP.NET Core Module的源码由C++编写,入口是main文件中的RegisterModule函数。
其函数内部实例化了CProxyModuleFactory工厂类。
pFactory = new CProxyModuleFactory;
而由这个工厂类创建的CProxyModule实例中有一个关键的CProxyModule::OnExecuteRequestHandler方法。它会创建FORWARDING_HANDLER实例,并调用其OnExecuteRequestHandler方法。
在此方法里就有那些核心的处理HTTP请求的操作。
在ASP.NET Core应用程序这端,CreateWebHostBuilder(args).Build().Run();
代码执行之后,会调用其对应的异步方法:
该方法中又调用了WebHost的StartAsync方法:
BuildApplication方法内部从IoC容器取出KestrelServer的实例:
最后调用KestrelServer的StartAsync方法:
到了这一步,KestrelServer终于可以监听来自ASP.NET Core Module发出的HTTP请求,而ASP.NET Core应用程序也可以开始其自身的任务处理了。
相关文章:
.Net Core开发日志——Global Tools
.Net Core开发日志——Peachpie
.NET Core开发日志——Middleware
.Net Core Cors中间件解析
.NET Core开发日志——Runtime IDentifier
原文地址:https://www.cnblogs.com/kenwoo/p/9309264.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com