跳到主要內容

Asp.Net Core Debug Source Code

寫過Asp.Net Core Web MVC應該知道裡面要使用很多的Middleware,如果要知道裡面的運作方式,就要看Source Code,或者想知道自己寫的程式哪裡出問題,有時候就必須Debug進Source Code中看變數的變化

如何Debug Source Code我是參考DEBUGGING ASP.NET CORE 2.0 SOURCE CODE這篇文章來設定的,作法如下:

1.點選[工具]的[選項] 

2.展開[偵錯]的[一般],並將[啟用Just My Code]的選取方塊取消,以及[啟用來源連接支援]的選取方塊點選起來 

3.接著點選[偵錯]的[符號],並將[Microsoft伺服器]的選取方塊點選起來 (點選之後會出現提示視窗,因為載入這些符號,會導致一些效能上的影響,尤其是首次載入,讓我以為Visual Studio當機了...)

這樣就可以Debug Source Code了,接著開始測試看看 :

1.先開啟一個新的專案(我選擇Asp.Net Core Web 應用程式)

2.因為只是測試所以都用預設的, 一直按確定就好, 除了Asp.Net Core 3.1改成5.0(操作方式都一樣沒差, 我只選5.0只是為了節省下載符號的時間以及空間而已,如果我選3.1它會下載這個版本的符號一次, 下次我選5.0它又會下載這個版本的符號一次)



3.專案自動建好後, 於視窗右邊的 HomeController.cs 按兩下, 視窗左邊就會看到檔案的內容, 接著找到 Index 的 rertrn View(), 在這列的前面點一下即可設定中斷點, 就像下圖的左邊紅色圈圈一樣(因為要顧到初學者所以才會說的這麼仔細)

4.設定好中斷點(紅色圈圈)之後, 過來就按下 [ IIS Express ] 的執行(上圖中中間上面的黃色圈起來的地方), 或者按下 F5, 就會開始執行程式

5.如果是第一次執行, 可能會出現一個確認視窗, 要你確認是否IIS Express的SSL憑證?按下是即可, 下面一個視窗也請按是


6.接著畫面會停止不動像當機一樣, 不是當機只是第一次抓符號要很久, 只要耐心等候直到 return View() 由紅底變成黃底就跑完了, 黃色底的列代表程式目前執行到這, 暫時不繼續執行, 如下圖


7.接著點擊右上部的堆疊框架(如上圖的紅色框起來的地方), 展開後會出現如下圖的畫面

裡面列出了從開始到中斷點之執行經過(越下面的越早執行), 就可以清楚地看到 DeveloperExceptionPageMiddleware, HttpsRedirectionMiddleware, StaticFileMiddleware, EndpointRoutingMiddleware, AuthorizationMiddleware, EndpointMiddleware 的執行順序, 剛好與 Startup.cs 檔案中所寫的程式碼順序一模一樣, 如下圖 :


8.如果我想看 UseHttpsRedirection 的程式碼, 就可以點一下[堆疊框架]中的 HttpsRedirectionMiddleware, 第一次的話會出現一個如下圖的視窗, 選擇 [下載程式檔並繼續偵錯], 就會自動下載並開啟 Source Code 視窗, 我就可以去看原始碼是如何寫這功能的, 是程式學習的很好工具


9.如果我想要在 Source Code 中逐步執行(F11), 就可以在剛剛的 HttpsRedirectionMiddleware.cs 中設定中斷點即可, 我的操作如下 :

    9a.在 Invoke 副程式的第一列設中斷點(如下圖, 程式碼如果沒改變的話應該是83列)


    9b.接著按下 Shift+F5 停止偵錯剛剛停掉的中斷點(return View()), 再重新按下 F5 執行, 程式就會停在 HttpsRedirectionMiddleware.cs 中我設的中斷點上了(如下圖)


    9c.接著去看自動變數的視窗(如上圖左下角的紅色框區域)(通常我只看監看式視窗而已, 要看甚麼變數自己加), 如裡面有個 context 變數, 展開後有很多的資料, 了解一下對提升網站知識是很有幫助的, 展開後裡面的 context.Request.RouteValues 這個時候是沒資料的, 因為 RouteValues 要經過 EndpointRoutingMiddleware 才會出現, 也就是app.UseRouting()之後才會有資料, 在這之前的程式都不會有資料的, 這我怎麼知道的呢? 在EndpointRoutingMiddleware.cs上設中斷點, 去觀察RouteValues的變化就會知道它是在這裡出現資料的 

10.從這個例子就知道 Startup.cs中的Configure程式碼的順序非常重要, 排錯了會出事情的

開發工具 : Visual Studio 2019 16.8.3版
專案 : Asp.Net Core Web 應用程式(MVC, .Net 5.0)


留言

這個網誌中的熱門文章

Excel C# (一) : 增益集 (Add-Ins) 之自訂函數

Excel的自訂函數除了之前介紹的VBA方式外, 還可以用 JavaScript, C# 等, 我就來試試看用C#來開發 我爬文找到了這篇 Excel-DNA 裡有詳細的教學, 不過我還是自己照做一遍看看是否成功 ! 第一步先開啟 Visual Studio 2019, 專案選擇 "類別庫(.NET Framework)" 過來將專案名稱輸入 MyExcelAddIns, 其他不變按下 "建立" 第二步接著在 "工具"->"NuGet 套件管理員"->"管理方案的 NuGet 套件", 將 Excel-DNA 套件加入至專案中 第三步將專案中的 Class1.cs 檔案刪除, 自己新增一個類別 "MyFunctions", 然後我複製 https://excel-dna.net 該網站上的範例, 貼進來方便測試 第四步我則是將方案組態由 "Debug" 改成 "Release"(如上圖的紅框), 再按 "建置" 下的 "重建方案" 產生 Excel XLL 檔案, 再去方案總管的 MyExcelAddIns 上按右鍵, 選擇 "在檔案總管中開啟資料夾" 會看到下面第二張圖 過來我的習慣是將這個 Release 目錄整個複製, 貼到桌面方便測試 ! 第五步則是開啟空白的Excel, 按 "程式開發人員" 下的 "Excel增益集", 點擊瀏覽後, 選擇桌面上我剛剛的 Release 資料夾, 如果Excel是32位元則選 MyExcelAddIns-AddIn.xll 檔案, 如果是64位元版本則選擇 MyExcelAddIns-AddIn64.xll 檔案, 接著在 Excel 任一儲存格輸入 =SayHello("World!"), 結果出現 Hello World!, 表示一切都正確, 接著我可以開始建立自己的函數了! 最後我個人認為自訂函數的VBA與C#兩種方式, 其優缺點如下:VBA的優點...

Asp.Net Core Web 多國語系(一)

微軟內建的多國語系目前分為三種 : 第一種是寫在Controller中的(通常用在商業邏輯判斷之錯誤顯示) 第二種是寫在View中的(通常用於畫面功能顯示以及UI顯示用) 第三種是寫在Data Model的Attribute中, 然後自動顯示在View中(通常用於與資料庫相關之資訊顯示, 如欄位名稱, 資料輸入之格式錯誤訊息) 我先來嘗試寫第一種 - Controller : 首先我先建立一個 Asp.Net Core 的 MVC 專案 NetCore ( 程式碼下載 , 如果想從無到有自己動手一步一步做, 可以參考微軟官網範例 MvcMovie , 我的專案就是從這小改來的, 只是將資料庫從LocalDB小改成InMemoryDB而已) 第二步打開Startup.cs, 並在下圖位置新增程式碼 services.AddLocalization(options => options.ResourcesPath = "Resources"); 第三步新增Resources資料夾, 並新增兩個資源檔案 "Controllers.MoviesController.resx" 和 "Controllers.MoviesController.en-US.resx" 如下圖 : Controllers.MoviesController.resx檔案的內容如下(檔案名稱沒包含語系表示是預設語系): Controllers.MoviesController.en-US.resx檔案的內容如下(en-US表示英語系): 以上表示系統是英語語系,  "Hello" 會轉換成 "Hello(en-US,Movies)" 來顯示, 正常應該是轉換成  "Hello" 就好, 我多顯示其他文字只是用來知道這個 "Hello" 是由哪個語系檔案轉換來的而已 非英語系的 "Hello" 則會轉換成 "Hello(Default,Movies)" 來顯示, 表示是從預設檔案而來 以上第二以及第三兩個步驟是多國語系的共通步驟, 過來才是 Controller 的部分 第四步驟則是打開 MoviesControlle...