代码结构与基本功能
准备条件
- 带有 ASP.NET 和 Web 开发的 Visual Studio。
创建第一个项目
为了保证能够更清晰的了解代码结构,我们这里使用.NET 8.0
创建ASP.NET Core 空模板
项目(Minimal API App
)。
代码结构
- 解决方案
- 项目
- 属性
- 依赖项
- appsettings.json (配置文件)
- Program.cs (项目入口)
- 项目
项目入口及启动过程
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 项目的启动大概有以下过程:
- 使用
WebApplication.CreateBuilder(args)
创建一个 WebApplicationBuilder 实例(用于配置服务、添加配置源和日志等)并配置。详情参考 主机(Host) - 通过
builder.Services
来注册依赖注入(DI)服务,例如控制器、数据库上下文等[空模版中未生成]。详情参考 依赖注入(Dependency injection) - 使用
var app = builder.Build();
创建一个WebApplication 实例(运行时的应用程序)。 - 通过
app.Use...
系列方法添加中间件和管道[空模版中未生成]。详情参考 中间件(Middleware) app.MapGet("/", () => "Hello World!");
在 ASP.NET Core 应用中映射一个 GET 请求的路由,并返回 "Hello World!" 响应。详情参考路由和控制器(Routing)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之前版本启动过程如下:
- 使用
Host.CreateDefaultBuilder(args)
创建主机(用于配置服务、添加配置源和日志等)并配置。 - 使用
webBuilder.UseStartup\<Startup>()
指定 Startup 类,这个类负责应用程序的配置。 - 使用
ConfigureServices
方法注册应用程序需要的服务。可以添加各种服务,比如 MVC 框架、数据库上下文、认证服务等。这些服务通过依赖注入的方式在应用程序中使用。 - 使用
Configure
方法定义应用程序的中间件管道。中间件负责处理 HTTP 请求,并决定如何路由请求、处理静态文件、启用身份验证等功能。 - 调用
.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请求过程大概如下: