是否可以調試不是從 Visual Studio 中啟動的 ASP.NET Web 應用程序?
從 Visual Studio (Casini) 中啟動的預設 ASP.NET Web 伺服器在我的開發機器上有點問題,所以我喜歡發佈到我的開發機器上的本地 IIS 實例並查看那裡的 Web 應用程序。但是,當我以這種方式啟動應用程序時,我不會自動進入“調試模式”。
我知道 VS 2010 具有“附加到程序”調試功能,但我不確定如何使用它。我需要做什麼才能從 Visual Studio 中調試本地 IIS ASP.NET Web 應用程序?具體來說:
- 我需要在 Web 應用程序的配置中更改哪些設置?
- 我需要更改哪些“打包/發佈設置”?
- 我需要在 IIS 中更改什麼嗎?
- 在“附加到程序”螢幕中我需要做什麼特別的事情嗎?
背景資訊:我在帶有 IIS 5.1 和 .NET 4.0 的 Windows XP SP3 上執行 Visual Studio 2010。
附加資訊:
我應該補充一點,我已經嘗試附加到 aspnet_wp.exe,但是當我轉到一個我知道其中有斷點的頁面時,當我將滑鼠懸停在“開放圓圈”斷點上時,我會收到以下消息:
目前不會命中斷點。沒有為此文件載入任何符號。
我從來沒有在 Visual Studio 中使用 F5 讓它工作,即使它被設置為部署到本地 IIS 伺服器。我不確定到底是什麼問題,但我最終能夠讓它以更“手動”的方式工作。讓它工作的一個重要部分是確保您正在生成調試符號並將它們部署到您的網站。以下是我為最終讓它發揮作用所採取的步驟:
- 在本地硬碟驅動器上為您的應用程序創建一個新文件夾,該文件夾將用於您的 Web 應用程序。
- 在 IIS 中手動創建一個指向您創建的文件夾的新虛擬目錄。
- 如果您使用的是 .NET 4.0 Web 應用程序,請確保將 IIS 中的網站屬性或虛擬目錄屬性設置為使用 ASP.NET 4.0。
- 在 VS 2010 中,右鍵點擊您的 Web 項目,然後點擊“發布”。使用以下設置:
- 發布方式:Web Deploy
- 服務網址:http://localhost
- 站點/應用程序:
IIS Web Site Name/Virtual Directory
- 您需要指定 IIS 網站名稱,後跟剛剛指定的虛擬目錄的名稱。網站的預設名稱通常只是Default Web Site。例如,如果您將虛擬目錄命名為MySolution.MyProject,您將指定Default Web Site/MySolution.MyProject 作為站點/應用程序。
- 在目標上標記為 IIS 應用程序:我未選中此選項。
- 在目的地留下額外的文件(不要刪除):我目前沒有選中它。
- 在 VS 2010 中,右鍵點擊您的 Web 項目並選擇“屬性”。使用以下設置:
在編譯選項卡中:
- 點擊“高級編譯選項…”按鈕(我使用的是 VB.NET;在 C# 中可能略有不同)。
- 確保“生成調試資訊”設置為Full。(還有一個pdb-only選項,我沒有嘗試過。這也可能有效)。
在Web選項卡中:
- 在Servers下,選擇Use Custom Web Server並指定新應用程序的地址;例如:http://localhost/VirtualDirectory。
- 注意:由於我最終沒有使用 F5 調試應用程序,因此我不確定是否需要執行此步驟。
在打包/發布 Web選項卡中:
- 您應該能夠使用設置只有執行此應用程序所需的文件才能部署項目…。
- 確保未選中
排除生成的調試符號。 - 注意:出於安全目的,您可能不希望在生產環境中部署調試資訊,除非絕對必要。
完成上述操作後,您應該準備好部署應用程序以便對其進行調試。以下是我用來部署和隨後調試應用程序的步驟:
- 右鍵點擊您的 Web 項目,然後點擊Publish。
- 確保您的設置仍然是從上面的第 3 步定義的。
- 點擊發布按鈕。這將根據目前的建構配置自動建構應用程序並將其發佈到指定的 web 主機。
- 繼續並導航到 Web 應用程序中的一個頁面,以確保應用程序啟動。
- 在 VS 2010 中,點擊Debug菜單並選擇Attach to Process。選擇正在執行的 ASP.NET 程序(在 Windows XP 中,它是aspnet_wp.exe)並點擊Attach。
- 您現在應該能夠向程式碼中添加斷點,當您從瀏覽器導航到 Web 應用程序中的各個頁面時,這些斷點將觸發。
雖然此方法效果很好,但請記住,它不僅僅附加到您的本地開發環境。如果另一台電腦上的另一個使用者要訪問 Web 應用程序,我相信只要您正在調試該過程,斷點仍然會觸發。
您需要做的是使用附加來處理和定位 aspnet_wp.exe。根據作業系統的風格,它可能是 w3wp.exe。我曾經有一個宏來執行此操作,但它在 VS2008 之後停止工作。