using ASP.NET Core 建立 C# Web 應用程式
[[academy-video-youtube({"vid": "87oOF9Ve-KA", "start_time": "0", "title": "Creating C# Web Application with ASP.NET Core", "creator": "Tim Corey", "length": "52m 05s"})]]
建立網頁應用程式是現代開發者的基本技能,而了解核心的專案結構是必不可少的。 本文受到 Tim Corey 在 "Intro to Web API" 影片的啟發,深入探討使用 ASP.NET Core 框架建立網頁應用程式的複雜性。
透過遵循 Tim 的見解,我們將探索如何設置、配置和優化您的網頁應用程式,充分利用 ASP.NET Core 框架的潛力來構建高效且可維護的網頁和 API。不論您是網頁開發的新手還是想要精進您的技能,本指南將幫助您掌握網頁開發的複雜性,為您提供建立有效且高效能網頁應用程式所需的知識。
介紹
Tim Corey 開場介紹了使用 ASP.NET Core 建立 API 的主題。 他強調了了解 API 基礎知識對於建立強大且可擴展的網頁應用程式的重要性。
Tim 以解釋 API 在現代軟體開發中扮演的關鍵角色作為開端,促進了不同網頁開發框架之間的通信,如 Blazor 網頁伺服器和 Blazor 網頁組件。 甚至 Razor 頁面的底層專案型別也因為 ASP.NET Core 而能夠在多個專案中無縫整合各種功能來構建網頁應用程式。
建立 ASP.NET Core Web API 專案
首先,Tim Corey 演示了如何設置一個新的 ASP.NET Core Web API 專案。 以下是他影片中概述的步驟:
打開 Visual Studio:首先打開 Visual Studio Installer 並選擇建立新專案的選項。

選擇 API 模板:從專案模板中選擇 "ASP.NET Core Web API" 並點擊下一步。

配置專案設置:輸入專案名稱、選擇位置和解決方案名稱。

附加資訊:選擇 .NET Framework,選擇認證型別,並建議不更改其他設置。

- 建立專案:點擊 "建立" 以使用預設配置和必要程式碼生成專案。
此設置為探索 API 開發提供了基礎,Visual Studio 生成了一個包含基本組件的基本結構,例如 Program.cs、controllers 資料夾和 appsettings.json。
預設 API 應用程式概述
在 Tim Corey 影片的 5:57,他提供了由 ASP.NET Core 生成的預設 API 應用程式的概述。
運行預設應用程式
Tim 首先運行預設的應用程式,展示開發者預設可獲得的內容。 執行後,專案會構建 API,下載必要的 NuGet 套件,並啟動一個網頁。 這個初始設置在沒有任何修改的情況下展示了 API 的基本結構和功能。

與 API 的互動
啟動的網頁由 Swagger 提供技術支持,現在被稱為 OpenAPI。 Swagger 提供了易於使用的介面來與 API 進行互動。 它允許開發者和非開發者輕鬆地了解和測試 API 的端點。 這個介面特別有利於可視化 API 的工作原理和文件紀錄。
探索 Swagger
Swagger 展示了 API 中可用的端點。 在預設設置中,其中一個預配置的端點是 "天氣預報" 端點。 透過點擊這個端點並使用 "Try it out" 功能,使用者可以執行 API 調用並查看回應。 這個回應包括了一個以 JSON 格式的天氣預報,展示了 API 如何返回資料。
Tim 在 8:32 強調,儘管從瀏覽器直接閱讀原始 JSON 資料可能很困難,但 Swagger 的文件覆蓋使其更容易消化。 文件提供了關於端點的詳細資訊,包括請求方法(GET、POST 等)、返回資料的結構和任何所需的參數。
JSON 文件和 API 版本控制
Swagger 也會生成一個 JSON 文件,如 Tim 在 9:10 指出的,該文件以機器可讀的格式記錄了 API。 這種文件對其他需要與 API 互動的應用程式至關重要,因為它描述了可用的端點、資料結構和預期的回應。
Tim 在 9:29 提到 API 中版本控制的重要性。預設設置包括了版本指示器,暗示可能存在多個 API 版本。 版本控制對於維護向後相容性至關重要。 當對 API 的更改可能會破壞現有客戶端時,擁有多個版本允許開發者在不干擾當前使用者的情況下引入新功能或更改。
什麼是 API
在 11:22 標記處,Tim Corey 解釋了 API(應用程式介面)在現代網頁開發中的基本作用。 他強調其在管理和保護不同軟體組件之間的資料交換中的重要性。
API 的目的
Tim 強調大多數應用程式圍繞資料進行——檢索、操作和顯示。 API 作為使用者介面和底層資料之間的中介,提供了一種安全和高效的資料存取方式。 這種中心化對於以下幾個原因而言至關重要:
安全性:API 提供了一種安全的方式來管理資料存取。 移動和客戶端應用不應直接連接到資料庫以避免在客戶端程式碼中嵌入資料庫證書,這會對安全構成重大風險。
- 抽象性:API 將資料層從使用者介面中抽象出來,使不同的客戶端應用(移動應用、網頁應用、桌面應用)得以與同一資料源互動,而不需暴露資料庫或其憑證。
不同框架中的多樣性
Tim 指出 API 不限於特定框架或語言。 例如,C# API 可以被 JavaScript 框架如 Angular、React 或 Vue 存取,展示了 API 的跨平臺性能。
API 網頁應用程式程式碼審查
在 15:21,Tim Corey 開始了 ASP.NET Core API 專案的結構和功能的詳細介紹。 以下是他的解釋內容,這些是使用 HTTP 伺服器和伺服器端技術建立 API 網頁應用時需要了解的重要點:
1. Program.cs 概述
Tim 審查了 Program.cs,指出其構建了網頁應用程式並配置了服務,如控制器和 Swagger(OpenAPI)的依賴注入。 程式碼在構建和運行應用程式之前設置了基本服務。
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();2. 環境配置
Tim 解釋了如何在 launchSettings.json 中配置環境設置。 預設環境設置為 "開發" 以供本地測試,啟用 Swagger。 在生產環境中,通常禁用 Swagger 出於安全考量,但移除開發檢查可以啟用它。
{
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}3. HTTPS 重新導向和控制器
Tim 指出了 HTTPS 重定向和控制器的映射。 此設置確保 API 路由正確配置。 他偏好使用 "api" 前綴以在 HTTP 請求和回應路徑中提供清晰度,這可以被修改以確保 API 路徑是獨立的。
4. 天氣預報控制器
Tim 深入介紹了 WeatherForecastController.cs,突出路由配置。 預設路由為 /weatherforecast,可以被修改以包含 "api" 前綴。 控制器使用 HTTP GET 來檢索資料,可通過指定路徑存取。
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public string? Summary { get; set; }
}using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public string? Summary { get; set; }
}5. HTTP 動詞和路由
Tim 解釋了 HTTP 動詞(GET、POST、PUT、DELETE)如何定義 API 端點。 對於 GET 請求,瀏覽器會調用控制器中的指定方法。 其他動詞需要像 Postman 這樣的工具來測試。
建立 API 控制器
Tim 演示了建立 API 控制器的過程:
新增控制器:右鍵點擊 "Controllers" 資料夾並選擇 "新增 > 控制器"。
選擇 API 控制器:選擇 "API 控制器 - 空" 並為控制器提供一個名稱。

- 定義動作:在控制器中實作動作以處理不同的 HTTP 請求。 Tim 提供了程式碼範例,展示如何定義 GET、POST、PUT 和 DELETE 方法。 詳細的程式碼請參考影片從 26:25 開始。
這項實作演示幫助開發者了解如何構建和配置 API 控制器來處理各種型別的請求。
REST API
Tim Corey 介紹了 REST(表述性狀態轉移)及其原則:
什麼是 REST:REST 是設計網路應用程式的一種架構風格。 它依賴於無狀態通信並使用標準 HTTP 方法(GET, POST, PUT, DELETE)執行操作。
RESTful 原則:RESTful API 使用 URL 模式來表示資源。 例如,
/users檢索所有使用者,而/users/5檢索具有 ID 5 的特定使用者。- REST 合規:Tim 指出完全達到 REST 合規性可能具有挑戰,因為 REST 最初是一種理論模型。 然而,遵循 REST 原則可以導致更直觀和一致的 API。
Tim 強調,儘管建議達到 REST 合規性,但實際上的考量應該引導 API 設計,確保其可用性和功能性。
最小 API 應用程式
Corey 介紹了最小 API,這是一種簡化的 API 開發方式在 ASP.NET Core 中:
設置最小 API:Tim 展示了如何通過設置專案時取消勾選 "使用控制器" 選項來建立最小 API 專案。
簡化程式碼:最小 API 消除了使用控制器和路由屬性的需要,允許開發者直接在
Program.cs中使用像app.MapGet(),app.MapPost()等方法定義端點。- 程式碼範例:Tim 提供了一段程式碼範例,其中一行程式碼定義了一個端點。 他演示了如何以最小的配置將 GET 請求映射到一個端點。
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();最小 API 被設計來簡化開發,特別是對於較小的應用程式或微服務。
為什麼選擇最小 API
Tim 討論了最小 API 的優點:
建立新專案:Tim 建立了新的 Web API 專案,但這次在附加資訊中他取消勾選了使用控制器選項。 這允許建立專案來使用最小 API。

減少樣板程式碼:最小 API 通過去除對控制器和額外路由配置的需求來減少樣板程式碼的數量。
簡單性:它們為簡單的 API 提供了一種更加簡單的方法,使程式碼更易於理解和維護。
- 微服務:最小 API 對於微服務特別有用,API 需要執行的操作有限且不需要傳統控制器的完整功能集。
Tim 承認,儘管最小 API 對於某些場景是有利的,但傳統控制器可能更適合於較大或更複雜的應用程式。
最佳實踐、總結和最後的評論
Tim Corey 以 API 開發的最佳實踐結束了他的教程:
關注點分離:避免將業務邏輯直接放在
Program.cs或控制器動作中。 相反,將邏輯遷移到單獨的類庫或服務中以保持程式碼的整潔並符合 SOLID 原則。API 作為使用者介面:將 API 視作使用者介面,專注於令其直觀且文件化良好。 Tim 強調清晰文件和高效 API 設計的重要性。
Swagger 和文件:利用 Swagger 進行 API 文件紀錄和版本控制。 Tim 解釋了如何利用程式碼中的 XML 註釋來生成詳細的 API 文件。
- 其他考量:考量快取、速率限制和其他因素以增強 API 的性能和安全性。
Tim 鼓勵開發者探索不同的專案型別和工具,強調理解 API 及其在現代軟體開發中的角色的價值。
結論
Tim Corey 的 影片 提供了關於在 ASP.NET Core 中建立和管理 API 的全面指南,涵蓋了 RESTful 和最小 API 方法。 他的見解不僅幫助開發者掌握 API 設計的基本要素,還提供了執行有效解決方案的實用建議。
獲得更多關於 C# 和其他專案型別的深入教程和見解,請務必存取 Tim Corey 的 YouTube 頻道,IAmTimCorey。


