Hero Image
[.NET] 開發階段管理應用程式的敏感資料

基於資訊安全的理由,密碼等敏感性資訊不應該出現在程式碼裡面, 應該把敏感性資料儲存在專案以外的地方,防止對 Git Server 提交專案程式碼的時候把密碼推送到伺服器上, 因此程式開發、部屬階段都應該用適當的策略存放敏感性資料讓程式讀取使用, .NET 儲存敏感性資料大致上來說可以用這兩種方式: 環境變數 Secret Manager 這裡紀錄要如何在 .NET 開發環境以 Secret 儲存敏感性資料,以及程式讀取的方式。 Secret Manager Secret Manager 就是在本地端特定路徑存放 secret.json 檔案: %APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json ~/.microsoft/usersecrets/<user_secrets_id>/secrets.json 需要先針對個別專案啟用專案的 Secret Storage 支援,切換到專案目錄執行: dotnet user-secrets init 在專案檔裡的 UserSecretsId 區段會得到一段 GUID,這個要作為 user_secrets_id 資料夾名稱。 <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId> </PropertyGroup> 以指令設置一組 secret,例如連線字串: dotnet user-secrets set "ConnectionStrings:POSTGRES" "User ID=root;Password=myPassword;Host=localhost;Port=5432;Database=myDataBase;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;" --project "D:\workspace\MySolution\MyProject" 以檔案直接設置 secret windows type .\input.json | dotnet user-secrets set Linux/MacOS cat ./input.json | dotnet user-secrets set 在程式裡面存在 secret.

Hero Image
[.NET Core] 不阻塞的非同步控制器(Non-Blocking Asynchronous Controllers)

ASP .NET Core 當中的 Web 控制器屬於IO密集的應用程式,當中主要使用的 TAP 是一種簡易使用、語言層級的非同步設計模式。 透過 TAP 可設計出非同步(Asynchronous)/非阻塞(Non-Blocking)的 Web API,大幅提高 Web 應用程式的併發性(Concurrency)。 非同步方法 C# 當中基於 TAP 設計的的非同步方法 (TAP method) 有幾個特性: 產生可等待 awaitable 型別 (Task, Task<TResult>, ValueTask, 和 ValueTask<TResult>), 其中以 Task、Task<TResult>最常見。 非同步方法的參數順序通常跟同步版本的方法相同,但方法名稱以 Async 結尾。 async、await await 運算子用來等待非同步行為完成, 或等待非同步行為完成後解析回傳值, await 運算子只能用在非同步方法中, 因此 await 運算子的外層方法必須套用 async 修飾, 否則會出現錯誤。 非同步 Action 設計原則: 總是加上 async 關鍵字 async 的方法裡面可以等待非同步方法。 action 前加上 async 的作用在於建立一個管理回傳任務的狀態機(state machine), 當 async 方法擲出例外時會被狀態機捕獲並放到任務中回傳, 而這也是以 Task 作為回傳值的方法的預期行為。 如果沒有 async 關鍵字則擲出的例外會被直接傳遞到呼叫者(caller), 因此除非確定該 aciton 不會擲出任何例外,否則一律加上 async。