MVC - CRUD
🎃 Detail
要顯示哪些資料 (Projection)
Routing + Model Binding 怎麼把 id 傳進去
找不到資料要怎麼回應
顯示哪些資料 (Detail)以學生(Student)為例,Detail 頁面通常只需要基本資料
姓名
入學日期
學號
不需要顯示「選修課程清單」(因為是一個集合,會放在「相關資料」頁面或 API)。
這樣做包含效能考量,如果每次打 Detail API 都把所有課程也撈出來,會很重。並且也讓職責清楚 Detail = 單一物件的資料,不是「關聯清單」。
Routing + Model Binding1http://localhost:1230/Student/Details/1
對應 Routing 規則
1url: "{controller}/{action}/{id}"
Controller
1public async Task<IActionResult> Details(int? id)
為什麼 ...
Swagger
後端 API 已經改好了,但前端卻還在用舊的呼叫方式,文件也沒有更新,這就像是兩個人在對話,一個講新語言,一個還在講舊語言,結果就會雞同鴨講。
這時候,Swagger 就像是一個貼心的小幫手 🐥。它會自動幫你把 API 說明整理好,還能變成互動式的測試工具。更重要的是,它跟 OpenAPI 規範搭配之後,文件就不再只是「寫給人看的文字」,而是一份「電腦也能讀懂的契約」。這意味著,前後端、測試工具、甚至 SDK 產生器,都能直接根據這份文件來溝通。
🌿 套件Swashbuckle.AspNetCore.SwaggerUi
🌿 文件https://swagger.io/api-hub/
🌿 Swagger 與 OpenAPI 的關係
Swagger 是一個「專案 / 工具集」最早由 Wordnik 在 2010 左右提出的 API 文件產生工具,叫做 Swagger。它的核心想法:用一份 規格文件 (JSON / YAML) 來描述 API,然後可以自動產生「文件頁面」和「測試工具」。這份規格文件,後來被業界廣泛接受。
OpenAPI 是 ...
Cert
憑證公鑰驗證流程CN / SANRoot Certificate (根憑證)本機開發環境自簽的 Root Certificate不同的憑證https 與憑證summary憑證是一個「資料包」,裡面同時包含
網域資訊(CN/SAN)
公鑰(Public Key)
其他欄位(有效期限、用途…)
CA 的數位簽章(Signature)
公鑰只是其中一個欄位,功能是給 TLS 握手用(以及驗證伺服器真的有私鑰)
公鑰是非對稱加密(Public Key Cryptography)裡的一半鑰匙,通常是一對
公鑰(Public Key):可以公開給所有人私鑰(Private Key):只能放在伺服器手上,不能外流
在 HTTPS 裡面,公鑰主要用來做兩件事
協助建立加密連線瀏覽器拿到憑證的公鑰後,可以在握手過程中完成「只有真正持有私鑰的那台伺服器才接得住」的驗證/交換流程(不同握手版本細節不同,但核心概念是這樣)。
驗證連到的伺服器真的握有私鑰,因為只有持有私鑰的人,才做得到某些對應的加密/簽名運算
在瀏覽器輸入 https://example.com
瀏覽器跟 ...
Delegate - 委派的意義
在 .NET 裡,委派 (Delegate) 本質上就是一個「可以存放方法的變數」。像你平常會用 int x = 5; 來存一個數字,委派就是一個「方法變數」,它可以存「方法的位址」,以便之後呼叫。委派提供了「把方法包起來,交給別人去執行」的能力。
🧚🏻 委派與 Lambda 的關係Lambda 表示式 (Lambda Expression),是一種「快速寫法」來建立匿名方法 (Anonymous Method)。這些 Lambda 會自動轉換成委派物件,或轉成 Expression Tree (取決於用在哪裡)。而在 LINQ 裡,我們常常看到 .Where(x => x > 10) 這種 Lambda,它背後就是:Where 方法需要一個委派 (通常是 Func<T, bool>),Lambda 就是一個「方便產生委派」的語法糖。
傳統委派寫法1234567891011121314151617// 定義一個委派型別delegate bool MyFilter(int number);class Program{ ...
WebApi - ActionFilter
ActionFilter內建 Action FilterPipeline執行時間記錄統一回傳格式統一錯誤處理輸入驗證 (Model Validation Filter)防止重複送出請求 (Idempotency Filter)ASP.NET Core 中的註冊方式Filter 不要存狀態!summary在 ASP.NET MVC / Web API 裡,Action Filter(動作篩選器)就像是一個「小保全」或「攔截器」。它可以在 Action 執行前 或 Action 執行後 插入邏輯,幫你做額外的事情
把它想像成一場活動
活動開始前檢查門票 → OnActionExecuting
活動結束後收拾場地 → OnActionExecuted
結果要交給觀眾前再整理一次 → OnResultExecuting / OnResultExecuted
活動中如果出意外要處理 → OnException
好處是不用每個 Controller / Action 都重複寫相同程式,邏輯可以集中管理,讓程式更乾淨
123456789101112131415161 ...
MODEL Binding
Model Binding[FromQuery] – 查詢字串[FromRoute] – 路由參數[FromForm] – 表單欄位IFormFile – 檔案上傳[FromBody] – Request Body (JSON)[FromHeader] – HTTP Header[FromServices] – 依賴注入 (DI)案例:複合來源summary這一切其實都圍繞著一個核心:溝通與理解
HTTP 的世界裡,Request 扮演著使用者「開口說話」的角色,而 Model Binding 則像是一位貼心的翻譯員,幫我們把這些話語準確地轉換成程式可以理解的變數或物件
商品搜尋 + 分頁1GET /products?keyword=phone&page=2&pageSize=20
設定
12345678[HttpGet("products")]public IActionResult Search( [FromQuery] string keyword, [FromQuery] int page = 1, [FromQuer ...
WebAPI
WebAPIControllerBase 與 ControllerControllerBase ReturnAttributes自訂 Controller 行為 - 加入 Logging停用自動 400Buffering IEnumerableStreaming IAsyncEnumerableIActionResultIResultTypedResults + Results格式特定的回傳summmary在我眼中,Web API 就像是一座小小的「橋樑」,一邊是使用者,他們可能透過手機、網頁,甚至 IoT 裝置提出需求,一邊則是我們的系統,安靜地等待著請求,準備回應。Controller 與 ControllerBase 就像這座橋樑的守門人,決定了資訊要如何被傳遞、如何被呈現
而我們依據「交付介質」決定地基:HTML 畫面需要完整的 View 引擎支援,而純數據傳輸應保持輕量無負擔,有些橋樑華麗,鋪上了燈飾與雕花(Controller,帶著 View 的世界),適合人群來往、熱鬧非凡;有些橋樑則簡單而純粹(ControllerBase,專注於 API),只管讓資料穩穩地走過去,沒有 ...
RateLimit
超過時回 429 Too Many Requests
限流演算法Fixed Window:最好懂,像「每分鐘 60 次」適合大多數一般 API
Sliding Window:比固定視窗平滑,邊界比較不會突然爆量適合你很在意公平性
Token Bucket:比較像流量池,適合有突發流量的情境很多公開 API 會偏愛這個
Concurrency:保護重 CPU / 重 I/O API例如報表匯出、影像處理、AI 推論
把 RateLimiter 掛進 Program.cs用 AddRateLimiter 註冊政策
用 OnRejected 統一處理超限時的回應
回 429
有 Retry-After 就寫到 header
記結構化 log,後面好做告警
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970using System.Globalization;u ...
Routing
Routing為什麼需要 Routing?Conventional RoutingMapControllerRoute 順序問題Endpoint RoutingAttribute RoutingOrderBidirection專用路由MVC 可以同時支援 View 和 API保留字案例們Routing 就像是 應用程式的地圖導航。每一個進來的 HTTP Request(請求)都有一個 URL,而 Routing 的工作就是判斷這個 URL 該交給哪段程式(Endpoint)來處理。Endpoint 就像門牌號碼,實際處理請求的程式(例如某個 Controller 的 Action、Razor Page、或 API 方法)。
而 Routing 系統就像導航系統,它會根據你定義的規則,把 Request 送到正確的 Endpoint。更棒的是,Routing 不只單向,它不僅能 URL → Endpoint(使用者輸入網址,找到對應程式)。還能 Endpoint → URL(由程式自動產生正確的網址)
傳統的網站(像早期 ASP / PHP)網址通常長這樣
1/products ...
Model
Model 是系統「知道什麼」的部分,負責描述資料的結構與規則,是整個應用程式的資料核心
🎃 Seed在開發或測試階段,我們常常會希望資料庫一開始就有資料方便測試,這時候就可以使用「Seed」方法。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758public class SchoolInitializer{ public static void Initialize(SchoolContext context) { // 確保資料庫存在(如果不存在就建立) context.Database.EnsureCreated(); // 如果已經有學生資料就略過(避免重複加資料) if (context.Students.Any()) { return; } ...





