Untitled
title: mweb CORSC:\91APP\NineYi.WebStore.MobileWebMall\WebStore\WebAPI\Extensions\HttpModules\CorsModule.cs
Application_EndRequest
Access-Control-Allow-Origin「每次 Request 結束時」,自動決定
回應要不要加上 Access-Control-Allow-Origin
加上哪一個允許跨域的來源(Allow-Origin)
取得來源網址 (Origin / Referrer) → 判斷是否在允許清單 → 產生 Allow-Origin → 寫入 Response Header
Step 0:取得 HttpContext12var httpApplication = (HttpApplication)sender;var httpContext = httpApplication.Context;
✨ Step 1:錯誤狀態不處理 CORS1234if (httpContext.Response.StatusCo ...
Untitled
title: FluentValidationFluentValidationhttps://github.com/FluentValidation/FluentValidation
https://docs.google.com/presentation/d/1bj-cdmw9ArauCphDmmEm-D2QKRBnwohUuRv6TP2IRUs/edit?slide=id.g8394b5fbe8_0_53#slide=id.g8394b5fbe8_0_53
Wrapper Adapter
1.5.2 WrapperWrapper 模式是一種常見的設計模式,它可以用來包裝現有的物件,提供額外的功能或改變其行為。在泛型的幫助下,我們可以建立通用的 Wrapper 類別來處理任何型別的物件
🎯 Wrapper 基本概念Wrapper 類別的主要目的是:
🔐 封裝原始物件:提供對底層物件的受控存取
🎨 增強功能:在不修改原始類別的情況下添加新功能
🛡️ 保護資料:控制對包裝物件的存取方式
🔄 轉換介面:為不相容的介面提供適配
📝 實際應用範例以下範例展示了泛型 Wrapper 的使用和一些需要注意的問題:
123456789101112131415161718192021222324252627282930313233343536void Main(){ var items = new List<int> { 1, 2, 3 }; var wrappers = CreateWrapper2<int>(items); var store = new List<Wrapper<int ...
Untitled
title: Controller HeaderController 層 如何取得 Header註冊服務
1services.AddHttpContextAccessor();
在 ASP.NET Core 裡面,每當一個 HTTP 請求進來(像是有人開你的網站、叫你的 API),系統就會產生一個「HttpContext」物件,裡面記錄了使用者是誰(包含登入帳號),請求的網址、Header、Body,回應的資料 Session、Cookie 等等,但是這個 HttpContext 不是你想用就用的,它只在「有請求進來」的時候才存在,而且它不是自己隨時隨地可以 new 的東西。
所以問題來了,如果你寫的程式碼在「服務(Service)」裡面,例如 Repository 或其他非 Controller 的地方,你就拿不到 HttpContext,因為這些不是直接處理 HTTP 請求的
AddHttpContextAccessor() 的本質就是:
✅ 註冊一個可以讓你在任何地方都「安全地取得目前的 HttpContext」的工具。
當你呼叫這行之後,系統會幫你註冊一個叫做 IHttp ...
Cache Stampede
🌀 快取踐踏 (Cache Stampede)
當某個熱門資料的快取過期時,瞬間湧入大量請求,導致所有請求同時打到原始資料來源(如資料庫或第三方 API),形成類似「踩踏」的效應。這些請求原本應E2該從快取中直接取得結果,卻因快取剛好失效,全部穿透防線、直接進攻後端資源,造成伺服器短暫過載。
📦 實際案例:假設你有一個商品頁,每次顯示都包含了價格、樣式、庫存狀態等資訊。這些資料通常是快取的理想對象。但當電商促銷活動一開始,流量暴增,而快取又在這個時候剛好過期,所有用戶的請求就會「同時」觸發重新生成快取,導致伺服器一時間被壓垮。
🔒 解法:為了防止這種現象,系統會採用「資源鎖定(Lock)」機制,讓第一個進入的請求負責重建快取,其餘的請求等待結果完成後再讀取,這樣就能避免所有請求同時打進後端。
這也是一個絕佳的壓力測試案例!可以刻意設計快取在高流量時過期,觀察系統是否有妥善應對。
🌀 雷鳴群聚 (Thundering Herd)
在短時間內大量請求同時湧入,對快取系統或後端資源造成瞬間衝擊。不同於「快取踐踏」是因為某個快取過期才導致的,雷鳴群聚是主動湧現的洪流,常見於以下場 ...
Untitled
title: Validation在資料綁定 (Model Binding) 過程沒有收到資料時,會將結構型別 (struct type) 使用初始值當作預設值,參考型別 (reference type) 的話則會顯示 null。
一般常見的 結構型別如 int、double、float、DateTime 等。參考型別則如 string 及一般的 Class。
但 ASP.Net Core 有一個新玩意兒可以解決 - [BindRequired],設定方法只要把它原封不動掛上去可以了。
12345678910111213public class Book{ [BindRequired] public int Id { get; set; } [Required] public string Title{ get; set; } public DateTime PublishDate { get; set; }}
首先在 API Controller 中預 ...
Untitled
title: AWS S3不用 MemoryStream,用 StringContent 更省記憶體(推薦)
1234567891011121314151617private async Task UpdateS3DataAsync(string s3RecordData, string s3Path){ var putRequest = new PutObjectRequest { BucketName = _bucketName, Key = s3Path, ContentBody = s3RecordData, // ⭐不用手動 new MemoryStream() ContentType = "application/json" }; var response = await _amazonS3.PutObjectAsync(putRequest); if (response.HttpStatusCode != HttpStatusCod ...
Untitled
title: Encoding.UTF8.GetBytesEncoding.UTF8.GetBytes(yourString)因為 .NET 的 string 在記憶體中是用 UTF-16 存的(每個字兩個 byte)當執行
1Encoding.UTF8.GetBytes(yourString)
發生的事情是
.NET 看到一個字串(UTF-16)
用 UTF-8 的規則重新編碼
把每一個字拆成 UTF-8 所需要的 byte
回傳一個 byte[]
也就是 🔄 UTF-16 → UTF-8 → byte[]
以字「你」為例UTF-16 編碼(.NET string 的內部格式)是 0x4F60UTF-8 會把這個字轉成三個 byte E4 BD A0
📘 .NET 字串 → 用自己的語言(UTF-16)存🌍 外面世界(檔案、網路、API)都講 UTF-8🔧 GetBytes() 就是「把話翻譯成外面世界能懂的 byte」
StreamStream 是一種資料讀寫的管道
Stream 不關心資料從哪來
你可以一段一段讀
也可以一段一段寫
Stream 就像一根水管:💧 ...
Untitled
title: CancellationToken1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556public static async Task TaskStatusTest(){ var cts = new CancellationTokenSource(); var token = cts.Token; System.Console.WriteLine("Please Choose a Status : A : Completed, B : Fault : C : Cancel"); try { var result = await Task.Run(async () => { var inputTask = Task.Run(() => System.Console.ReadKey( ...





