ASP.NET Core Program.cs 文件

ASP.NET Core web 应用程序实际上是一个控制台项目,它从 Program 类中的入口点 public static void Main() 开始执行,在那里我们可以为 web 应用程序创建主机。

在 ASP.NET Core 3.0 中创建主机:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.AspNetCore.Hosting;
  6. using Microsoft.Extensions.Configuration;
  7. using Microsoft.Extensions.Hosting;
  8. using Microsoft.Extensions.Logging;
  9. namespace MyFirstCoreWebApp
  10. {
  11. public class Program
  12. {
  13. public static void Main(string[] args)
  14. {
  15. CreateHostBuilder(args).Build().Run();
  16. }
  17. public static IHostBuilder CreateHostBuilder(string[] args) =>
  18. Host.CreateDefaultBuilder(args)
  19. .ConfigureWebHostDefaults(webBuilder =>
  20. {
  21. webBuilder.UseStartup<Startup>();
  22. });
  23. }
  24. }

如上所述,Main() 方法调用方法表达式 CreateHostBuilder() 以使用预先配置的默认值构建 web 主机。CreateHostBuilder 表达式也可以写成返回 IWebHost 的方法,如下所示。

  1. public static void Main(string[] args)
  2. {
  3. CreateHostBuilder(args).Build().Run();
  4. }
  5. public static IHostBuilder CreateHostBuilder(string[] args)
  6. {
  7. return Host.CreateDefaultBuilder(args)
  8. .ConfigureWebHostDefaults(webBuilder =>
  9. {
  10. webBuilder.UseStartup<Startup>();
  11. });
  12. }

让我们来理解一下步骤。

Host 是一个静态类,可用于创建具有预配置默认值的 IHostBuilderIWebHostBuilder 的实例。CreateDefaultBuilder() 方法使用预先配置的默认值创建 WebHostBuilder 的新实例。在内部,它配置 KestrelIISIntegration 和其他配置。以下是 CreateDefaultBuilder() 方法。

  1. public static IWebHostBuilder CreateDefaultBuilder(string[] args)
  2. {
  3. var builder = new WebHostBuilder()
  4. .UseKestrel()
  5. .UseContentRoot(Directory.GetCurrentDirectory())
  6. .ConfigureAppConfiguration((hostingContext, config) =>
  7. {
  8. var env = hostingContext.HostingEnvironment;
  9. config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
  10. .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
  11. if (env.IsDevelopment())
  12. {
  13. var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
  14. if (appAssembly != null)
  15. {
  16. config.AddUserSecrets(appAssembly, optional: true);
  17. }
  18. }
  19. config.AddEnvironmentVariables();
  20. if (args != null)
  21. {
  22. config.AddCommandLine(args);
  23. }
  24. })
  25. .ConfigureLogging((hostingContext, logging) =>
  26. {
  27. logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
  28. logging.AddConsole();
  29. logging.AddDebug();
  30. })
  31. .UseIISIntegration()
  32. .UseDefaultServiceProvider((context, options) =>
  33. {
  34. options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
  35. });
  36. return builder;
  37. }

如上所述,CreateDefaultBuilder 方法创建 WebHostBuilder 的实例,并设置 Kestrel、内容根目录和集成 IIS 。

Kestrel 是 ASP.NET Core 的开源跨平台 web 服务器。它被设计为在代理之后使用,因为它还没有成熟到可以作为一个完整的 web 服务器。

它还调用 ConfigureAppConfiguration()appsettings.json 文件、环境变量和 user secrets 加载配置。ConfigureLogging() 方法将日志记录设置到控制台和调试窗口。

下一章,我们来学习 Startup.cs 文件。

分类导航