Skip to content

代码结构与基本功能

准备条件

  • 带有 ASP.NET 和 Web 开发的 Visual Studio。

An image

创建第一个项目

为了保证能够更清晰的了解代码结构,我们这里使用.NET 8.0创建ASP.NET Core 空模板项目(Minimal API App)。

An image

An image

An image

An image

An image

An image

代码结构

  • 解决方案
    • 项目
      • 属性
      • 依赖项
      • appsettings.json (配置文件)
      • Program.cs (项目入口)

An image

项目入口及启动过程

C#
namespace WebApplicationDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
            var app = builder.Build();

            app.MapGet("/", () => "Hello World!");

            app.Run();
        }
    }
}

Program.cs.NET Core 应用程序的入口点。

程序的加载顺序从 Program.cs 文件中的 Main 方法开始。

.NET 6.0及以上版本.net core 项目的启动大概有以下过程:

  1. 使用WebApplication.CreateBuilder(args)创建一个 WebApplicationBuilder 实例(用于配置服务、添加配置源和日志等)并配置。详情参考 主机(Host)
  2. 通过builder.Services 来注册依赖注入(DI)服务,例如控制器、数据库上下文等[空模版中未生成]。详情参考 依赖注入(Dependency injection)
  3. 使用var app = builder.Build();创建一个WebApplication 实例(运行时的应用程序)。
  4. 通过app.Use... 系列方法添加中间件和管道[空模版中未生成]。详情参考 中间件(Middleware)
  5. app.MapGet("/", () => "Hello World!");在 ASP.NET Core 应用中映射一个 GET 请求的路由,并返回 "Hello World!" 响应。详情参考路由和控制器(Routing)
  6. app.Run()启动应用程序,开始监听 HTTP 请求。

其他参考其他基本功能

.net 6.0相对之前版本的变化

在 .NET 6.0 及以后的版本中,ASP.NET Core 引入了简化的启动过程,也称为 "顶级语句(top-level statements)" 的编程模型。

这种新模式将原本分离的 Program.cs 和 Startup.cs 合并到了一个更加简洁的单一文件 Program.cs 中,精简了启动代码。

关键变化:

  • 合并了 Program.cs 和 Startup.cs:不再需要 Startup 类,所有服务注册和中间件管道配置都直接在 Program.cs 中完成。
  • 简化了主机创建和启动的过程:通过 WebApplication.CreateBuilder 和 builder.Build 来创建和配置应用程序。
  • 顶级语句:不需要显式的 Main 方法,这个语法糖减少了样板代码,简化了开发过程。(创建项目式不勾选[顶级语句]复选框)。

.net 6.0之前版本启动过程如下:

  1. 使用Host.CreateDefaultBuilder(args)创建主机(用于配置服务、添加配置源和日志等)并配置。
  2. 使用webBuilder.UseStartup\<Startup>() 指定 Startup 类,这个类负责应用程序的配置。
  3. 使用ConfigureServices 方法注册应用程序需要的服务。可以添加各种服务,比如 MVC 框架、数据库上下文、认证服务等。这些服务通过依赖注入的方式在应用程序中使用。
  4. 使用Configure 方法定义应用程序的中间件管道。中间件负责处理 HTTP 请求,并决定如何路由请求、处理静态文件、启用身份验证等功能。
  5. 调用.Build().Run()方法运行。

示例:

Program.cs

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Startup.cs

C#
public class Startup
{
    // 构造函数(可以通过依赖注入注入 IConfiguration)
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // 用于注册应用服务的 ConfigureServices 方法
    public void ConfigureServices(IServiceCollection services)
    {
        // 注册依赖项,添加中间件服务
        services.AddControllersWithViews();
    }

    // 用于配置中间件管道的 Configure 方法
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

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

启动过程及请求过程图解

以.net 6以上版本为例(其他版本类似),通常启动过程如下:

图片

按上述流程启动的服务,Http请求过程大概如下:

图片

Document Base on VitePress.