.NET 開發 web 時,想用 Console.WriteLine 印出變數的值,並追蹤 Request 的流程
開場白
由於先前曾使用過 Django ,非常習慣跑 Django 的開發模式。
在 Console Log 下,各種有用跟沒用的的資訊會一直像瀑布一樣輸出,對於追蹤自己程式的流程還蠻有幫助的。
像這樣:
Django 的開發模式,指令是 runserver,可以參考這篇 Python筆記:Django(1)
.NET IISExpress 這邊也有
IIS Express 的話,目前其實已經有出類似的功能了,讓工程師可以在程式執行過程中,以命令提示字元的模式,來觀察 Server 跟 Client 的互動,這種模式在開發 API 時十分的有用。
再搭配 C# 的 Console.WriteLine ,便可以在命令提示字元內觀察變數,這個做法我覺得好處在於測試整體流程很方便。
中斷點固然好用,但使用中斷點時,思考比較容易侷限在某一點,相對比較不容易用 Flow 的角度來 review 。
換言之在我看來,這個方式的比較是在測試整體 Flow。
大致步驟
1. 啟動 IIS Express 的命令模式
不要像平常一樣去按 Visual Studio 的「開始偵錯」(F5),先打開 cmd ,移動到 C:\Program Files\IIS Express 資料夾,執行 appcmd.exe list site
cd C:\Program Files\IIS Express appcmd.exe list site
如果你懶得每次都要移動到這個資料夾,可以考慮把 C:\Program Files\IIS Express 加入你的 PATH 環境變數。
2. 找到你想執行的站台
上一步的指令是讓你觀察你已經註冊的站台,現在,找到你想執行的站台,可能資訊像這樣:
SITE "WebApplication1" (id:4,bindings:http/*:15141:localhost,state:Unknown)
於是你知道你的站台 id 是 4
3. 用指令啟動 IISExpress 跑該站台
指令範例是
iisexpress.exe /siteid:4
或
iisexpress.exe /site:WebApplication1
4. 觀察運行狀況
執行後就會看到, IIS Express 已經用命令列模式啟動這個站了。
4.1 For more information about the error, run iisexpress.exe with the tracing switch enabled (/trace:error).
如果出現這個錯誤訊息,可能是因為你不知道 Visual Studio在你偵錯(F5)完畢後,不會結束掉 IIS Express 上正在跑的網站,所以你的站其實已經在跑了,自然無法再次以指令啟動。
這時候只要開啟 IIS Express 把正在跑的站關閉,即可順利用指令啟動囉!例如、桌面右下角工作列的圖示就可以進行快速檢視與關閉。
5. 開發時
現在你可以繼續開發,並在你需要追蹤、印出變數的地方,撰寫 Console.WriteLine()
- 每次修改 .cs 程式碼後,在 Visual Studio 內按下 F6 ,建置方案,建置完成後,就可以看到修改後的結果。
- 視情況,你可能需要重新啟動 IIS Express (先按Q中斷→再次執行即可)。
以前 Visual Studio 2012 的年代,我的印象是要自己重新啟動,最近使用 VS2019 的經驗,似乎 F6 建置後, IISExpress 都會自己重新載入,提供大家參考,反正沒生效時,試試看再建置一次、 IISExpress 重跑一次囉~
討論
比如有一段程式可能有這樣的邏輯:
if(v1 ==1) { /* 狀況一 各種處理 ... */ Console.WriteLine("v1=" + v1); } else if (v1 == 2) { Console.WriteLine("v1=" + v1); if (v2 == 3) { Console.WriteLine("v2=" + v2); /* 狀況二 各種處理 ... */ } else if (v2 == 5) { Console.WriteLine("v3=" + v3); switch (v3) { case 0: /* 狀況三 各種處理 ... */ Console.WriteLine("v4到底是多少:" + v4); break; case 1: /* 狀況四 各種處理 ... */ Console.WriteLine("v4到底是多少:" + v4); break;
建置完畢後,讀取該網頁(或是 Call 該 API),就可以看到 命令列有以下輸出:
C:\Users\test> iisexpress /siteid:4 Starting IIS Express ... Successfully registered URL"http://localhost:15141/" for site "WebApplication1" application "/" Registration completed for site "WebApplication1" IIS Express is running. Enter 'Q' to stop IIS Express 開始的要求: "GET" http://localhost:15141/WebForm1.aspx v1=2 v3=2 v4到底是多少:100 結束的要求: "http://localhost:15141/WebForm1.aspx",HTTP 狀態為 200.0 開始的要求: "GET" http://localhost:15141/favicon.ico 結束的要求: "http://localhost:15141/favicon.ico",HTTP 狀態為 404.0
可以看到,除了 Requsst 以及 Response 以外,程式也一路在 Console上,按照你的要求印出變數,因此,要追蹤程式跑到哪、當時變數是多少,就變得比較清晰了。
Leave a Reply