Index
太陽拉麵B Tree Index經常變動的欄位上建立索引,有什麼風險?Clustered Index 與 Non-Clustered IndexIndex ScanClustered Index ScanSeek vs Scan 的「取捨邏輯」典型 Index Seek(少量、可定位)什麼狀況特別容易 Scan(而不是 Seek)summary一天,阿冠帶著夥伴腦袋與毛吉,到 LaLaport 尋找夢寐以求的「太陽拉麵」
到了商場門口,三人抬頭一看
哇哩!這地方足足有六層樓,還超級大!
腦袋皺著眉說:「我們從一樓開始,一層一層慢慢找吧!」
毛吉在旁邊激動地汪汪叫:「阿烏旺旺旺旺!」看起來沒有甚麼幫助
阿冠搖搖頭,露出無奈的表情,仿佛已經習慣這一切
「Follow me」
三人走到一樓的樓層導覽地圖前,阿冠熟練地滑動著手指,找到了那行關鍵字:「🍜 太陽拉麵 → 3樓中區 C312」
「走吧!直奔三樓中區!」沒花幾分鐘,他們就聞到濃濃的豚骨香
腦袋驚呼:太神了吧!我們沒繞半圈就找到了!」
阿冠微微一笑,扶著眼鏡:「這是 Index 的力量!」在多數資料庫中(例 ...
WebAPI - MWeb
啟動點流程
IIS 啟動網站應用程式池 (Application Pool)
當有請求進來時,IIS 會把 Request 交給 ASP.NET Runtime (w3wp.exe)。
w3wp.exe 是什麼?w3wp.exe = IIS 的 Worker Process(工作進程)
IIS 6/7/8/10 都會用 Windows Process Activation Service (WAS) 啟動 w3wp.exe
每個 Application Pool 會有自己的 w3wp.exe
網站的程式碼、ASP.NET Runtime、Http Pipeline 都是在 w3wp.exe 裡面運作
👉 w3wp.exe 是容器(Container)──不是 Runtime 本身。
ASP.NET Runtime 是什麼ASP.NET Runtime 指的是:
Page Handler Factory (System.Web)HTTP Pipeline(Modules + Handlers)Request Processing Pipeli ...
Built-in Middleware
UseCorsUseAuthentication()UseAuthorization()UseStaticFilesUseRateLimiterUseResponseCachingUseHttpsRedirectionUseHsts結語CORS 的本質是瀏覽器端的安全機制(Same-Origin Policy 的例外白名單)。伺服器只透過回應標頭「宣告」哪些 Origin、方法、標頭被允許;最後放不放行是瀏覽器決定,他的角色是偵測跨域請求,依 Policy 加上允許的回應標頭。並且透過預檢且允許的方式,直接回 204/200 給瀏覽器,省去進一步處理。當不允許時,伺服器通常不加標頭、也不主動丟 403;接著的行為取決於你的管線/其他中介
🎀 Simple Request(簡單請求)瀏覽器送出真正的請求
例如 GET https://api.contoso.com/orders,同時自動帶上 Origin: https://app.example.com 標頭。
CORS Middleware(UseCors)判斷
如果政策允許這個 Origin,就在回應上加 A ...
Middleware - Sequence
關於順序ExceptionHandler(最外層)HSTS(嚴格要求瀏覽器以後都用 HTTPSHttpsRedirection(把 HTTP 導去 HTTPS)Static Files(靜態檔案:js/css/images)Routing(建立 Endpoint 資訊)CORS(跨網域規則)Authentication(驗證你是誰)Authorization(你能不能做這件事)Custom middlewares(你自己插的)實境演練Short-circuit(短路)會讓「後面永遠不執行」關於 Middleware 的順序,要把「會影響後面所有處理的規則」放前面、把「需要前面資訊才做得了的事」放後面,這樣每個 middleware 才拿得到它該拿的上下文,而且不會做白工或做錯事,順序決定了「誰先看到 Request」、「誰能先改/短路 Response」、「誰能拿到路由/使用者/權限資訊」
他把後面任何地方炸掉的例外「接住」,統一回應格式/錯誤頁,放最前是因為它要能包住整條管線,才能攔到所有後面丟出的 exception,假如放在後面,前面炸了它 ...
Custom Middleware
GuardsCorrelationIdMiddleware一次性攔截所有請求,回傳 503 Service UnavailableApiKeyMiddleware結語想像你走進一片森林,每個訪問都是一個 HTTP 請求 🌳。森林裡的每個樹屋(Service / Middleware)都會依序經過,有的樹屋會幫你掛上名牌(CorrelationId),有的會在入口拉下柵欄(Maintenance Mode),還有的會檢查你有沒有森林通行證(API Key)。這些小樹屋站點就是 Middleware,它們靜靜地守護著這片森林,讓森林安全、有序
當系統有很多請求同時進來時,Log 會變得很亂。如果我們能幫每一條請求配一個 唯一編號 (Correlation Id),那麼不論請求經過多少 Service,都能用這個編號把 Log 串起來。就好比 📦 快遞公司給每個包裹一個「物流追蹤碼」,你就能隨時查到它走過的所有路徑
嘗試從 Request Header 讀取 X-Correlation-ID(若前端傳進來就沿用)
若沒有,就自己產生一個 Guid
存到 HttpConte ...
Middleware - Relay
Middleware 的運作原理pipeline為什麼 Middleware 裡要寫 async?直接呼叫 next() 不行嗎?🌿 Map 分支🌿 RequestDelegate🌿 結語
想像一個 HTTP 請求進到伺服器,就像一場 接力賽跑
接力棒 就是 HttpContext,裡面裝著這次請求與回應的所有資訊
選手 就是一個 Middleware
接棒的手勢 就是 RequestDelegate
比賽終點 就是 Controller 或 Razor Page,產生最後的回應
ASP.NET Core 的 Middleware 機制,就是靠這樣一場「人人都要接棒」的比賽,把請求一路傳遞下去,直到完成回應
在 ASP.NET Core 中,整個 HTTP 請求(Request) 和 回應(Response) 的處理,就像一條 管線 (Pipeline)。這條管線是由一個個的小元件(我們叫它 Middleware)組合起來的。決定要不要把請求交給下一個中介軟體。在下一個中介軟體之前做事(例如:紀錄 log、驗證身分)。在下一個中介軟體之後做事(例如:修改回應、壓縮資料)。如果 ...
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{ ...









