为什么ASP.NET Core采用Main方法?

需要记住的最重要的一点是,ASP.NET Core Web 应用程序最初作为控制台应用程序启动,Main() 方法是应用程序的入口点。因此,当我们执行ASP.NET Core Web应用程序时,首先它寻找 Main() 方法,这是执行开始的方法。然后,Main()方法将ASP.NET配置并启动它。此时,应用程序将成为ASP.NET Core Web应用程序。
如果进一步查看 Main() 方法的正文,则会发现它通过将命令行参数 args 作为参数传递来调用 CreateHostBuilder() 方法,如下所示。

  1. public static void Main(string[] args)
  2. {
  3. CreateHostBuilder(args).Build().Run();
  4. }

如下所示,CreateHostBuilder() 方法返回实现 IHostBuilder 接口的对象。主机是一个静态类,可用于创建具有预配置默认值的 IHostBuilder 实例。
CreateDefaultBuilder() 方法使用预配置的默认值创建主机构建器的新实例。在内部,它配置 Kestrel(用于ASP.NET的内部 Web 服务器)、IIS整合和其他配置。

  1. public static IHostBuilder CreateHostBuilder(string[] args) =>
  2. Host.CreateDefaultBuilder(args)
  3. .ConfigureWebHostDefaults(webBuilder =>
  4. {
  5. webBuilder.UseStartup<Startup>();
  6. });

在 Main()方法中,在此 IHostBuilder 对象上,调用 Build() 方法,该方法实际生成 Web 主机。
然后,它将我们asp.net Web 主机中托管我们的Asp.net Core Web 应用程序。
最后,在 Web 主机上,它称为 Run() 方法,该方法将实际运行 Web 应用程序,并开始侦听传入的 HTTP 请求。

启动类(Startup)

在设置主机时,还使用 IHostBuilder 类的 UseStartup() 扩展方法配置启动类。启动类有两种方法,如下所示。

  1. public class Startup
  2. {
  3. // This method gets called by the runtime. Use this method to add services to the container.
  4. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
  5. public void ConfigureServices(IServiceCollection services)
  6. {
  7. }
  8. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  9. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  10. {
  11. if (env.IsDevelopment())
  12. {
  13. app.UseDeveloperExceptionPage();
  14. }
  15. app.UseRouting();
  16. app.UseEndpoints(endpoints =>
  17. {
  18. endpoints.MapGet("/", async context =>
  19. {
  20. await context.Response.WriteAsync("Hello World!");
  21. });
  22. });
  23. }
  24. }

ConfigureServices() 方法配置应用程序所需的服务。Startup 类的Configure() 方法设置应用程序的请求处理管道。

CreateDefaultBuilder() 方法执行的任务是什么?

作为设置 Web 主机的一部分,CreateDefaultBuilder() 方法执行几项操作。其中一些如下:

  1. 设置 Web 服务器
  2. 从各种配置源加载主机和应用程序配置
  3. 配置日志记录

    在下一章, 我们将讨论CreateDefaultBuilder() 方法究竟对配置和设置 Web 服务器的作用以及应用程序的托管模型。