發表文章

資料庫使用 HIERARCHYID 紀錄樹狀關聯資料

圖片
手上有個案子,資料間有階層性關聯, 原本使用 ParentId 欄位紀錄,隨著樹狀結構變得複雜, 查詢時隨著樹狀結構層數加深,要取得/確認節點間是否屬於同一分支就變得相當麻煩… 後來發現 SQL 提供一種資料型態 HIERARCHYID , 透過編碼紀錄從樹狀目錄根到節點的路徑。 此表示以斜線為開頭,而且只有造訪根目錄的路徑才會以單一斜線表示。 子系之間的比較是透過按照字典順序比較以小數點隔開的整數序列加以執行。 每個層級後面都跟著一個斜線。 因此,斜線會分隔父代與其子系。例如: / /1/ /1/2/4 接下來以範例來說明怎麼使用吧! 資料模型 - 分公司銷售量 假設公司分為兩個分公司: 台北 、 新竹 ,兩公司間的人員僅可檢視自己所在區域的銷售量,但總公司的董事長則可檢視分公司的所有資料。 範例就是這麼簡單; 首先,先來建立相關的資料表: 先建立部門: CREATE TABLE Department ( No HIERARCHYID NOT NULL, // 部門代號,以階層方式記錄 Name NVARCHAR(40) NOT NULL, // 部門名稱,識別用 Level AS No.GetLevel(), // GetLevel()為內建的函式,代表樹狀結構中節點深度, Path AS CAST(No AS NVARCHAR(100)) // ) 以此結構下,建立各分公司資料: INSERT INTO Department VALUES(’/1/’, ‘總部’) INSERT INTO Department VALUES(’/1/1/’, ‘台北’) INSERT INTO Department VALUES(’/1/1/1/’, ‘信義區’) INSERT INTO Department VALUES(’/1/1/2/’, ‘內湖區’) INSERT INTO Department VALUES(’/1/2/’, ‘新竹’) INSERT INTO Department VALUES(’/1/2/1/’, ‘東區’) INSERT

Application Insight 資料取樣設定

圖片
最近在查系統問題,為了追查使用者傳送的參數與系統使用狀況時,查看 Application Insight 紀錄時,卻發現紀錄明顯比實際傳送過的訊息少! 原來是因為 Application Insight 在所有最新版本的 ASP.NET 和 ASP.NET Core SDK 中預設啟用調適型取樣 (Adaptive Sampling),也就是依據資料數量進行取樣調整,以減少流量與資料成本。 確認目前取樣比例: 查看方式為: Step 1. 登入 Azure Portal Step 2. 開啟 Web App 對應的 Application Insight 查詢視窗 Step 3. 輸入以下指令: union requests,dependencies,pageViews,browserTimings,exceptions,traces | where timestamp > ago(1d) | summarize RetainedPercentage = 100/avg(itemCount) by bin(timestamp, 1h), itemType Application Insight 取樣模式: 有以下三種取樣模式: 調適型取樣 ( Adaptive sampling ): 系統自動調整 ASP.NET/ASP.NET Core 應用程式中從 SDK 傳送的遙測量;為預設模式 固定速率取樣 ( Fixed-rate sampling ): 比例由開發者自行設定。 用戶端和伺服器會同步處理它們的取樣 內嵌取樣 ( Ingestion sampling ): 適用於 Azure 入口網站,根據自訂的取樣比例,捨棄來自應用程式的一些遙測資料。不會減少從應用程式傳送的遙測流量,但可協助讓流量不要超過每月配額。 停用取樣 為了記錄所有應用程式使用狀況,需要停用取樣,根據不同程式版本,關閉取樣的設定方式也不同: 非 ASP.Net Core (例如 .Net Framework): 尋找在專案中的設定檔 - ApplicationInsights.config 中,將 AdaptiveSamplingTelemetryProcessor 節點移除或設成註解。 ( 參考來源 )

.Net Core 程式優化原則參考

今天閱讀到一篇關於 .Net Core 程式優化文章 ,順手翻譯、摘錄,作為參考: JIT 與 inline 篇: 已下為不會被轉譯為 inline 的函式: 1.1 大於 32 bytes 的程式碼 1.2 虛擬函式 1.3 含有除 if / else 之外的複雜流程控制的函式(例如: switch / while) 1.4 含有例外處理的程式碼,但會拋出例外的程式碼可能仍會被轉譯 1.5 傳入參數為結構或泛型 垃圾收集與記憶體配置篇: 可選用 cache 機制、區域物件 cache、使用 using 以有效控制物件存取範圍 有效率的使用 Filter 功能: .Net Core 提供以下 5 種 Filter: Authorization filters Resource filters Action filters Exception filters Result filters 根據不同時機選用 DI 服務生命週期的類型: DI 生命週期分為以下三種: Transient : 每次請求時都會產生新的 Instance Scoped : 每個 http Request 都會產生一份 Instance Singleton : 整個 Application 只會有一份 Instance 避免使用 LINQ LINQ 難以被 JIT 優化,並且對效能有影響,但有時是不可避免使用,須謹慎評估。 另一方面,LINQ to SQL 比 LINQ 更危險,應謹慎使用。 重構自動產生的程式碼 自動產生的程式碼是參考,程式設計師才最懂程式架構與流程 .NET Core 應用程式發佈方式: 7.1 Framework-dependent deployment (FDD): 最小封裝尺寸;僅包含應用程式程式碼與第三方套件內容 7.2 Self Contained Deployment (SCD): 封裝包含 .Net Core 函式庫與 .NET Core runtime,可獨立執行 7.3 Framework Dependent Executables (FDE): 與 FDD 相似,封裝在目標平台上執行的可執行檔,僅包含應用程式程式碼與第三方套件內容 回應壓縮:可使用回應壓縮中

ASP.NET Core API 指定回傳格式為 json

圖片
【狀況】 使用 ASP.NET Core 站台建置 API 時,回傳 Guid 字串時,前端(Angular)發生 Exception 【原因】 回傳內容格式,格式被設定為 text 【修正】 在 Controller 宣告處加上  [Produces("application/json")] 回傳格式就會自動設定為 json 以上,收工!

ASP.NET Core中文編碼

最近在處理字串加密過程中,需要指定編碼做內容轉換, 意外踩到了 .NET Core 編碼的坑。 起因是這段程式碼: private static string PlainTextToHex(string str) { byte[] strBytes = Encoding.GetEncoding("BIG5").GetBytes(str); string strHEX = BitConverter.ToString(strBytes); strHEX = strHEX.Replace("-", ""); return strHEX; } 在取得 Encoding 時會出現以下錯誤訊息: 'BIG5' is not a supported encoding name. 原來是 .NET Core 僅保留最常用的編碼, (詳細支援清單請見下方 MSDN 連結) 其他編碼器需另外安裝 使用步驟: 1. 開啟 Package Manager Console,輸入以下指令 Install-Package System.Text.Encoding.CodePages 2. 註冊編碼提供者: 需註冊後才能使用額外編碼,可將以下程式碼放在程式入口 (例如:Startup 中) Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 做完就可以快樂使用囉~ 參考來源: 1.  [.NET Core] Encoding.GetEncoding(950) 取得繁體中文失效 !? 2. MSDN: Encoding Class

如何使用 VSTS 提供私有 nuget 套件下載

圖片
最近因為部門購買了開發套件,有版權關係,所以只能提供部門人員使用,不能放在公開的 nuget 站台。 透過 Azure DevOps 管理專案以及相關套件,超輕鬆方便,接下來就看看怎麼做吧! [註] :寫這篇文章的時候,才發現原本使用的 VSTS,已經整合到 Azure DevOps 服務中,最近不得不說微軟最近動作很積極啊~ 雖然是免費的,但也有很多功能,對於管理專案、相關套件、DevOps都很方便,建議大家也申請來試看看吧! 步驟 步驟 1. 開啟 Azure DevOps 的專案頁面,選擇 “Artifacts” ,並點選右上角的 “Connect to feed”: 步驟 2. 在設定畫面中,先下載 NuGet 工具包 (如下圖 1 所示): (或是點此 連結 ) 步驟 3. 將工具包解壓縮,並將要上傳的套件(副檔名為 .nupkg) 放入同一目錄中 步驟 4. 圖中步驟 2 是將此 Package Source 加入至 NuGet 管理清單中,真正將套件上傳是圖中步驟 3,所以可以直接合併一步做完~ nuget.exe push "<package_source_url>" -ApiKey VSTS <nupkg>           Package source URL 前後記得加上雙引號(") [註] :在操作過程中,因為重複試了很多次,後來就出現 指定的來源已新增到可用封裝來源清單。請提供唯一名稱。 試各種方式,例如:清除 NuGet cache、刪除 NuGet 套件目錄,也無法排除,意外發現可以直接一步做完 :P 步驟 5. 回到 Azure DevOps 專案頁面,就可以看到剛才上傳的套件囉~~ 以上!收工 謝謝收看~

[VS2017] ASP.NET Core 搭配 Angular 與 angular-cli

圖片
在建立 ASP.NET Core 整合 Angular 專案時,遇到無法建立 Angular 元件的問題, 在此紀錄處理方式,也提供有相同困擾的捧油! 環境: Microsoft Visual Studio Community 2017 v.15.7.5 ASP.NET Core:2.1.202 Node.js:8.9.1 angular-cli:6.0.8 建置方法: 步驟 1. 建立專案 建立專案:選擇 " .NET Core 專案 " 並選擇 " Angular 範本 " VS2017 已經為我們建立基本的專案架構, 框線中的是 Angular 專案目錄 步驟 2. 安裝 angular-cli 開啟命令列視窗,輸入以下指令以安裝 angular-cli (如果已經安裝過,可以略過此步) npm install -g @angular/cli@latest 進入專案目錄,輸入以下指令以安裝相依性套件 npm install --save-dev @angular/cli@latest 步驟 3. 修改 app.shared.module 檔名 將 ClientApp\app\app.shared.module.ts 改名為 ClientApp\app\app.module.ts 步驟 4. 修改引用 app.shared.module 在前一步驟檔名變更後,會有編譯錯誤,所以有兩個引用處需要修改: ClientApp\app\app.server.module.ts ClientApp\app\app.browser.module.ts 步驟 5. 建立 angular.json 為了使用 Angular CLI,需要 angular.json 設定檔。 但是目前專案下沒有,所以需要用點小技巧建立。 (如果已經有其他 Angular 專案,可以直接跳至步驟 2) 開啟命令提示字元,切換至一個空目錄 (例如:C:/), 輸入以下訊息建立一個 Angular 專案 ng new sample --skip-install   ( --skip-install 參數,明確指定不執行 npm in