WebAPI-Program

WebAPI-Program

在 ASP.NET Core 中,程序的入口点通常是在 Program.cs 文件中定义的,这个文件负责配置和启动 Web 应用程序

Program.cs 文件中的主要对象是 WebApplicationBuilderWebApplication,这两个对象分别用于配置和构建应用程序


WebApplicationBuilder

WebApplicationBuilder 是用于配置应用程序的构建器对象。它提供了一种集中配置应用程序的方式,包括配置服务、中间件、主机和环境等。

  • Configuration:获取或设置配置提供程序。
  • Environment:获取当前的 IWebHostEnvironment 对象,用于访问环境信息。
  • Services:获取 IServiceCollection,用于注册服务。
  • Build():构建 WebApplication 实例。

WebApplication

WebApplication 是实际运行的应用程序实例。它负责配置和执行中间件管道,并处理 HTTP 请求。

主要方法和属性

  • Environment:获取当前的 IWebHostEnvironment 对象。
  • Use* 方法:用于配置中间件,例如 UseRoutingUseEndpointsUseAuthentication 等。
  • Run():启动应用程序并开始监听传入的请求。

.NET不同版本

需要注意的是,在.NET 6和.NET Core 3.1中,程序的入口(Program)是调用了不同的方法来启动ASP.NET项目

.NET Core 3.1

.NET Core 3.1调用了CreateHostBuilder方法来初始化项目

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

/// <summary>
/// 创建Host
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((builder, config) => { GetSMSelectConfiguration(config, Configuration); })
        .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
        .ConfigureDynamicInterceptor()
        .UseNLog();

.NET 6

.NET 6调用了WebApplication

public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);
    builder.Configuration.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", true)
                         .AddEnvironmentVariables();
    AddSmSelectConfiguration(builder.Configuration, builder.Configuration);

    var startUp = new Startup(builder.Configuration, builder.Environment);
    //注入服务
    startUp.ConfigureServices(builder.Services);

    // 在创建 Host 之前设置
    AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);

    //配置nlog
    builder.WebHost.UseNLog();

    //构建WebApplication
    var app = builder.Build();

    //配置管道
    startUp.Configure(app);

    //运行WebApplication
    app.Run();
}

Startup.cs

在ASP.NET Core中,Startup.cs 文件是一个非常重要的文件,它用于配置应用程序的启动过程。Startup.cs 文件中的 Startup 类包含两个主要方法:ConfigureServicesConfigure。这两个方法分别用于配置应用程序的服务和中间件。

在 .NET 6.0 中,ASP.NET Core 引入了一种新的简化启动模式,称为“最小API”(Minimal API)。这种新模式旨在减少样板代码,使应用程序的启动配置更加简洁和直观。因此,传统的 Startup.cs 文件在 .NET 6.0 中被取消了,取而代之的是在 Program.cs 文件中直接配置服务和中间件

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Register services here
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // Configure the HTTP request pipeline here
    }
}

ConfigureServices

ConfigureServices 方法用于配置应用程序的服务。这些服务可以是任何需要通过依赖注入(Dependency Injection, DI)容器管理的对象,包括数据库上下文、业务逻辑类、第三方库等。

  • 注册服务:将服务注册到DI容器中,以便在应用程序的其他部分通过构造函数、属性或方法注入使用。

  • 配置选项:设置应用程序的各种配置选项,如数据库连接字符串、日志记录配置等。

  • 添加框架服务:注册MVC、身份验证、信号R等框架服务。


Configure

Configure 方法用于配置应用程序的请求处理管道。通过在这个方法中注册中间件,你可以定义HTTP请求如何被处理。

  1. 注册中间件:将中间件组件添加到请求处理管道中,以便它们可以在请求到达最终处理程序(如控制器)之前或之后执行特定的逻辑。
  2. 配置中间件顺序:中间件的执行顺序由它们在 Configure 方法中的注册顺序决定。先注册的中间件会先处理请求,后注册的中间件会后处理请求。
  3. 设置路由:定义应用程序的路由规则,以便将请求映射到相应的控制器和动作。

MapControllers

在 .NET 6.0 及更高版本中,ASP.NET Core 的中间件配置有所简化。特别是,UseRouting 和 UseEndpoints 方法被合并到了 MapControllers 和其他 Map 方法中。这使得配置更加简洁和直观。

// 这是.NetCore 3.1的写法

app.UseRouting(); // 配置路由

app.UseAuthentication(); // 配置身份验证
app.UseAuthorization(); // 配置授权

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});


// 这是.NET 6.0的写法

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

在 .NET 6.0 及更高版本中,MapControllers 方法不仅映射了控制器路由,还隐式地包含了路由和终结点的配置。这意味着你不再需要显式调用 UseRouting 和 UseEndpoints,因为 MapControllers 会自动处理这些步骤