.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上,按照你的要求印出變數,因此,要追蹤程式跑到哪、當時變數是多少,就變得比較清晰了。

You Might Also Like

Leave a Reply

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料