從 WebApplicationBuilder 原始碼開始著手
CreateBuilder 階段
服務與中介軟體註冊
Build 階段
端點註冊
執行階段
var builder = WebApplication.CreateBuilder(args);
// 服務註冊
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddHttpClient("github");
// 應用程式建構與中介軟體設定
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
// 端點定義
app.MapGet("/ping", () => Results.Ok(new { ok = true }));
app.MapGet("/repos/{owner}/{name}", async (string owner, string name, IHttpClientFactory factory) =>
{
var http = factory.CreateClient("github");
var url = $"https://api.github.com/repos/{owner}/{name}";
var req = new HttpRequestMessage(HttpMethod.Get, url);
req.Headers.UserAgent.ParseAdd("minimal-api");
var resp = await http.SendAsync(req);
return Results.Stream(await resp.Content.ReadAsStreamAsync(), "application/json");
});
app.Run();
以下是流程簡單的描述
狀態:已建立/等待啟動
→ 呼叫 Start()/排程 → 等待執行
→ 執行緒池執行進入點 → 執行中
→ 使用者委派執行:成功/拋出例外/拋出取消例外
→ 完成
→ 若有附加子任務:等待子任務完成 → 最後子任務完成
→ 第二階段完成:設定狀態為完成/錯誤/取消
→ 第三階段完成:清理資源 + 通知父任務 + 執行接續動作
→ 啟動等待/接續任務/多重等待等後續操作