﻿# 如何善用「偵錯模式」進行 ASP.NET 網站或 .NET 程式開發

在專案開發初期，我們都會寫很多測試程式碼(Test Code)用來紀錄或顯示程式執行時期的狀態，雖然開發環境有**中斷點** (Breakpoint) 可以使用，但程式部署到測試機或正式機時卻未必有開發工具可用，這時利用自己寫的測試程式碼就非常有用，但專案上線前若又需要把測試程式碼刪除頗為麻煩，今天我就打算分享一些很實務的偵錯開發技巧。

在 C# 中有個 [#if](http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx) 語法非常的實用，不過好像很少人在用。請先參考下圖的 Solution Configuration (方案設置) 選單，預設就有 Debug 與 Release 兩個選項可用，當專案需要建置時可以利用這兩個選項進行快速切換，以產生不同的組件輸出。

![Solution Configuration (方案設置) 選單](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/250b1f0e114ac4f66692-image.png "Solution Configuration (方案設置) 選單")

在你的程式中，可能會有以下的 Debug Code

![ViewData\["Message"\] += "(DEBUG)";](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7f4454dcec629c613264-image.png "ViewData[\"Message\"] += \"(DEBUG)\";")

透過 [#if](http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx) 語法與 [#endif](http://msdn.microsoft.com/en-us/library/hyx43has.aspx) 語法的包夾之後，你會發現在開發環境似乎沒什麼變化

![透過 #if 語法與 #endif 語法的包夾](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/df491a33662a66b79d72-image.png "透過 #if 語法與 #endif 語法的包夾")

但是當你將 Solution Configuration 選單切換至 Release 之後

![Solution Configuration (方案設置) 選單](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4a5d522d8049cedb162c-image.png "Solution Configuration (方案設置) 選單")

你就可以看見原本被 [#if DEBUG](http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx) 與 [#endif](http://msdn.microsoft.com/en-us/library/hyx43has.aspx) 語法的包夾過的程式碼自動變「灰色」的了

![原本被 #if DEBUG 與 #endif 語法的包夾過的程式碼自動變「灰色」](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/6b5ab159a5a9dbf4f055-image.png "原本被 #if DEBUG 與 #endif 語法的包夾過的程式碼自動變「灰色」")

這也代表著在將 Solution Configuration 選單切換至 Release 之後所建置 (Build) 出來的組件不會包含這些測試的程式碼，當組件部署至正式機時也完全不會影響程式執行的效率，因為 Visual Studio 在建置時 ( 或 C# 編譯器在編譯時 ) 就自動將這些 Debug Code 忽略掉。

同樣的技巧若套用在 ASP.NET Web Site (ASP.NET 網站) 專案就有點不同了，由於 ASP.NET 網站是個特殊的專案類型，執行時期所有程式碼都是動態編譯的，所以你無法利用這個技巧在 Visual Studio 開發工具中，但僅限於看到的程式碼全部都會出現灰色字而已，如下圖示：

![雖然 Solution Configuration 已經切換至 Debug 項目，但程式碼中依然出現灰底字](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/48c2a0c9be42dec308ed-image.png "雖然 Solution Configuration 已經切換至 Debug 項目，但程式碼中依然出現灰底字")

雖然 Solution Configuration 已經切換至 Debug 項目，但程式碼中依然出現灰底字，那是因為 ASP.NET Web Site 是動態編譯的，當網站還在 Visual Studio 中程式碼尚未進行編譯(即便你按 F6 編譯也一樣)，所以無法判斷目前的編譯環境。

ASP.NET Web Site 是否處於 Debug 模式是在 web.config 中定義的，當 compilation 的 debug 屬性設定為 true 時，動態編譯的程式碼就會自動套用 [#if DEBUG](http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx) 與 [#endif](http://msdn.microsoft.com/en-us/library/hyx43has.aspx) 語法，所以即便 Visual Studio 中無法預覽目前的程式碼狀態，但實際上在執行時一樣有支援這個開發技巧。

![ASP.NET Web Site 是否處於 Debug 模式是在 web.config 中定義的](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2fc52f6cba716df98724-image.png "ASP.NET Web Site 是否處於 Debug 模式是在 web.config 中定義的")

除此之外，在 ASP.NET 中如果需要寫程式判斷目前運行的是否處於「偵錯模式」的話，也可以透過 [HttpContext.IsDebuggingEnabled 屬性](http://msdn.microsoft.com/zh-tw/library/system.web.httpcontext.isdebuggingenabled.aspx)來判斷，如下程式範例：

```
if (HttpContext.Current.IsDebuggingEnabled){    Response.Write("<h1>DEBUG Enabled</h1>");}
```

實務上判斷目前網站是否處於「偵錯模式」其實非常有用，我們可以動態針對網站進行最佳化的動作，例如自動啟用網頁內容壓縮、JavaScript 內容最小化、壓縮 CSS 檔案、刪除或關閉特定的程式記錄、…等等，至於其他運用就要靠各位的創意發想了。

**相關連結**

-   [C# Preprocessor Directives](http://msdn.microsoft.com/en-us/library/ed8yd1ha.aspx)
-   [#if (C# Reference)](http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx)
-   [#else (C# Reference)](http://msdn.microsoft.com/en-us/library/87a56b46.aspx)
-   [#elif (C# Reference)](http://msdn.microsoft.com/en-us/library/88td0y52.aspx)
-   [#endif (C# Reference)](http://msdn.microsoft.com/en-us/library/hyx43has.aspx)
-   [Detecting ASP.NET Debug mode](https://weblog.west-wind.com/posts/2007/Jan/19/Detecting-ASPNET-Debug-mode)
-   [Debug and Release Builds in ASP.NET 2.0](http://odetocode.com/blogs/scott/archive/2005/11/15/2464.aspx)
-   [HttpContext.IsDebuggingEnabled 屬性](http://msdn.microsoft.com/zh-tw/library/system.web.httpcontext.isdebuggingenabled.aspx)
