ASP.NET Core 學習筆記
一、LINQ 與 EF Core
LINQ 是什麼?
Language Integrated Query(語言整合查詢)
- 在 C# 裡用統一語法查詢各種資料來源
- 支援:陣列、List、XML、JSON、資料庫(Entity Framework)
- 方法語法:函式式風格
- 查詢語法:SQL 式風格
LINQ 與 SQL Injection
LINQ 本身不是資料庫查詢,但用 EF Core 就安全
- 用在 Array / List → 沒有 SQL,不存在 SQL Injection
- 用在 EF Core(LINQ to Entities)→ 會轉成 SQL
- 關鍵:EF Core 會自動把 LINQ 查詢轉成參數化 SQL
- 輸入的資料永遠不會直接拼進 SQL 字串
- SQL Injection 基本上被阻擋
Entity Framework Core (EF Core)
.NET 的 ORM(Object-Relational Mapper)
功能:
- 把資料表映射成 C# 類別
- 用物件操作資料庫,不必直接寫 SQL
- 支援多種資料庫(SQL Server、PostgreSQL、MySQL、SQLite...)
核心概念:
- DbContext → 對應資料庫連線和操作
- DbSet<TEntity> → 對應資料表
- LINQ → 查詢資料表,就像查集合一樣
範例:
// 定義資料模型
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
// 定義 DbContext
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
}
// 使用 LINQ 查詢資料
using (var db = new AppDbContext())
{
var user = db.Users
.Where(u => u.Name == "Alice")
.FirstOrDefault(); // 會自動生成 SQL
}
二、ASP.NET 發展歷程
ASP (Classic ASP)
- 1996 年推出的伺服器端動態網頁技術
- 檔案副檔名是 .asp
- 使用 VBScript、JScript
- 現在幾乎淘汰
ASP.NET (.NET Framework 2.0 ~ 4.8.1)
- 2002 年起,基於 .NET Framework
- 支援 C# / VB.NET
- 開發模式:Web Forms (.aspx)、ASP.NET MVC、ASP.NET Web API
- 只能 Windows + IIS
- 最後一版是 4.8.1,微軟已停止更新
ASP.NET Core (2016 起)
- 全新跨平台版本,不再依賴 IIS 和 Windows
- 可在 Windows / Linux / macOS 執行
- 整合了 MVC、Web API、Razor Pages
- 從 .NET 5 (2020) 開始,微軟把「Core」字拿掉,改叫 .NET X
- .NET 5、.NET 6、.NET 7、.NET 8 都屬於「ASP.NET Core」家族
版本判斷速查表
名稱 |
代表什麼 |
ASP (Classic) |
1996 年的老 ASP,副檔名 .asp |
ASP.NET (.NET Framework 2.0 ~ 4.8.1) |
舊世代,只能 Windows + IIS |
ASP.NET Core (.NET Core 1.0 ~ 3.1) |
新架構,跨平台,高效能 |
ASP.NET Core on .NET 5+ (.NET 5, 6, 7, 8...) |
現在主流,名字只叫「.NET」,但本質上就是 ASP.NET Core |
判斷關鍵:只要看到 .NET 5、.NET 6、.NET 7、.NET 8,就一定是 Core 架構
三、跨平台與 Web Server
跨平台 (Cross-Platform) 定義
- 軟體可以在不同作業系統上運行(Windows、Linux、macOS)
- 同一份程式碼可以在不同 OS 上執行
IIS 的限制
- IIS = Internet Information Services
- Windows 專用的 Web Server
- 只能在 Windows 上運行
- 無法部署到 Linux / macOS → 不跨平台
Kestrel 的跨平台特性
ASP.NET Core 內建的跨平台 Web Server
- 支援 Windows / Linux / macOS
- 不依賴 IIS 或 Windows 專有 API
- 可以直接當 Web Server 使用
- 也可以放在反向代理後面:Nginx (Linux)、Apache (Linux)、IIS (Windows)
- 跨平台:Windows、Linux、macOS 都能跑
- 高效能,適合直接對外服務或配合反向代理
- 支援 HTTP/HTTPS
在 Visual Studio 建立的 Web API 專案中,dotnet run 或 F5 啟動時,專案就會用 Kestrel 來監聽指定的端口。
四、RESTful API 設計
REST 是什麼?
Representational State Transfer
Roy Fielding 博士在 2000 年提出的 Web API 設計風格,不是標準或協定。
核心概念:
- 資源(Resource)→ 用 URI 來標識,例如 /users/1
- 動作(Action)→ 用 HTTP 方法來表達(GET、POST、PUT、DELETE)
- 狀態轉移(State Transfer)→ 客戶端透過 HTTP 請求改變或查詢資源的狀態
RESTful API 的設計原則
(1) 資源導向(Resource-Oriented)
- ✅ /users/123 代表 ID 為 123 的使用者
- ❌ /getUserById?id=123(不夠 RESTful,因為動作藏在 URL)
(2) 使用 HTTP 方法表示動作
- GET /users → 取得所有使用者
- GET /users/123 → 取得 ID=123 的使用者
- POST /users → 建立新使用者
- PUT /users/123 → 更新 ID=123 的使用者(整個物件)
- PATCH /users/123 → 更新 ID=123 的部分欄位
- DELETE /users/123 → 刪除 ID=123 的使用者
(3) 無狀態(Stateless)
- 伺服器不應保存用戶端的會話狀態
- 每個請求都應該包含必要的驗證資訊(例如 JWT Token)
(4) 統一介面(Uniform Interface)
- 資源表現形式應統一,例如回傳 JSON 或 XML
- 資源 URL 應該清晰一致,例如 /orders/123/items
完美的 RESTful API 條件
- 資源 URL 清晰且語意化:不用動詞,而是名詞
- HTTP 方法正確使用:GET 查詢、POST 建立、PUT/PATCH 更新、DELETE 刪除
- 使用適當的 HTTP 狀態碼:
- 200 OK(成功查詢)
- 201 Created(成功建立)
- 204 No Content(刪除成功,不需回應內容)
- 400 Bad Request(請求格式錯誤)
- 401 Unauthorized(未認證)
- 404 Not Found(資源不存在)
- 500 Internal Server Error(伺服器錯誤)
- 無狀態:每個請求獨立,驗證用 Token
- 一致的資料格式:例如統一回傳 JSON,錯誤格式統一
{ "error": "UserNotFound", "message": "User with ID 123 not found" }
五、專案設定與屬性
appsettings.json
共用的值存放處
專案設定
- <Nullable>disable</Nullable> → 警告提示
- <ImplicitUsings>enable</ImplicitUsings> → using 從預設載入改成強制
[ApiController] 屬性
- 告訴框架這個 Controller 是 API 用的
- 不改變繼承鏈,只是屬性,不是父類別
- 啟用自動模型驗證
- 啟用自動 400 回應
- 自動推斷參數綁定