在Apache上調(diào)試ASP.NET 1.1/2.0代碼

2010-08-28 10:48:18來源:西部e網(wǎng)作者:

  我們知道ASP.NET 1.1的項(xiàng)目由于微軟設(shè)計(jì)和實(shí)現(xiàn)的原因,對IIS的依賴非常的緊密。不管是創(chuàng)建ASP.NET項(xiàng)目,還是打開、調(diào)試ASP.NET項(xiàng)目,都要求IIS運(yùn)行正常,否則什么都做不成。那么當(dāng)我們在Apache上運(yùn)行ASP.NET后,可不可以對其進(jìn)行源代碼級的step into/out調(diào)試呢?

  由于Apache2項(xiàng)目中的mod_aspdotnet sub-project實(shí)現(xiàn)上的問題(也可以說是bug吧),使我們在其上運(yùn)行ASP.NET程序時,和在IIS上的aspnet_wp|w3wp中運(yùn)行的正確性上有一些差別,所以在Apache(mod_aspdotnet)上調(diào)試ASP.NET項(xiàng)目的源代碼就很有必要。雖然ASP.NET 2.0已經(jīng)正式release,不過1.1版本的項(xiàng)目還是目前的主流,所以我們分別看看Apache對這兩個版本Framework的支持。正如我前面所說,ASP.NET 1.1的項(xiàng)目緊密地依賴IIS,所以目前我只能在Apache上調(diào)試已有的ASP.NET 1.1項(xiàng)目,而不能創(chuàng)建(原因后面再說)。由于IIS先安裝并占用了80端口,所以我的Apache Web Server就只能運(yùn)行在其它端口上了(如:8080,通過httpd.conf文件配置)。

  首先,我們需要讓這個被調(diào)試的項(xiàng)目在IIS上運(yùn)行正確,并且項(xiàng)目可以被VS.NET 2003 IDE正確開啟。然后配置Apache,讓這個項(xiàng)目同時在Apache上也運(yùn)行正確。我們就可以通過IDE的Ctrl+Alt+P來Attach希望被debug的進(jìn)程,這時我們會看到在任務(wù)列表(需要check "Show system processes")里居然有兩個Apache.exe進(jìn)程。這里我也不知道應(yīng)該是哪個,雖然它們的類型都是".NET, Win32",不過只有一個是mod_aspdotnet的宿主進(jìn)程。當(dāng)然我們還是可以用個小trick來判斷,就是打開taskmgr并刷新Apache上運(yùn)行的Web站點(diǎn)的頁面,看那個Apache.exe進(jìn)程占用CPU,那么它就是asp.net支持模塊的宿主。Attach成功后就可以在VS.NET里面設(shè)置斷點(diǎn),進(jìn)行step into/out的源代碼級調(diào)試了。

  上面是對ASP.NET 1.1項(xiàng)目的調(diào)試方法,如果是ASP.NET 2.0的項(xiàng)目呢?由于.NET Framework及Visual Studio 2005的改進(jìn),調(diào)試2.0的ASP.NET項(xiàng)目變得奇easy! 只需要把項(xiàng)目在Apache上運(yùn)行好后,用Visual Studio 2005打開希望調(diào)試的頁面的源代碼(*.cs)文件,Attach上Apache的進(jìn)程后直接設(shè)置斷點(diǎn)就可以了,根本不需要開啟項(xiàng)目,當(dāng)然也就和IIS完全脫離關(guān)系了。

 AvailableProcesses.png

// 不管是1.1還是2.0,都需要確定到底是哪個Apache.exe進(jìn)程是宿主

  在Apache上調(diào)試失敗的已知可能問題:

  1、沒有使用debug版的項(xiàng)目dll來運(yùn)行,這個...還是問題嗎?

  2、第二種情況,如果不注意,可能會認(rèn)為是Apache不能調(diào)試1.1的Asp.net。就是如果機(jī)器上同時裝了Fx1.1和Fx2.0,mod_aspdotnet會默認(rèn)把我們的ASP.NET程序加載在Fx2.0上運(yùn)行,這時如果用VS.NET 2003去調(diào)試將無法Attach任何Apache.exe進(jìn)程。當(dāng)然用Visual Studio 2005是可以的。解決辦法需要在httpd.conf中使用"AspNetVersion v1.1.4322"命令顯示指定Asp.net程序運(yùn)行時的.NET Framework版本。

  前面我提到了1.1版本的Asp.net項(xiàng)目的建立必須要IIS,這是因?yàn)樵趧?chuàng)建項(xiàng)目時VS.NET 2003需要向IIS獲取目前其支持的Asp.net的版本信息,然后通過一些Get和Post操作,創(chuàng)建一些項(xiàng)目必須文件在服務(wù)器上,具體步驟如下:

Created ASP.NET Project by VS.NET 2003 Command#region Created ASP.NET Project by VS.NET 2003 Command
GET localhost/DebugDemo/get_aspx_ver.aspx
500 Internal Server Error
GET localhost/get_aspx_ver.aspx
404 Not Found
GET localhost/DebugDemo/vs28758389629759149_tmp.htm
200 OK
POST localhost/DebugDemo/_vti_bin/_vti_aut/author.dll
100 Continue
401 Access denied
POST localhost/DebugDemo/_vti_bin/_vti_aut/author.dll
401 Access Denied
POST localhost/DebugDemo/_vti_bin/_vti_aut/author.dll
100 Continue
200 OK
POST localhost/_vti_bin/_vti_aut/author.dll
100 Continue
401 Access denied
POST localhost/_vti_bin/_vti_aut/author.dll
401 Access Denied
POST localhost/_vti_bin/_vti_aut/author.dll
100 Continue
200 OK
POST localhost/_vti_bin/_vti_adm/admin.dll
100 Continue
401 Access denied
POST localhost/_vti_bin/_vti_adm/admin.dll
401 Access Denied
POST localhost/_vti_bin/_vti_adm/admin.dll
100 Continue
200 OK
POST localhost/DebugDemo/_vti_bin/_vti_aut/author.dll
401 Access Denied
POST localhost/DebugDemo/_vti_bin/_vti_aut/author.dll
100 Continue
200 OK
POST localhost/DebugDemo/_vti_bin/_vti_aut/author.dll
#endregion

  同樣在ASP.NET 2.0中,這個步驟完全不需要了,ASP.NET項(xiàng)目就是一個目錄,完全的和Web Server脫離開了。我們也就再也不用因?yàn)镮IS的搗亂,而使的不能開發(fā)ASP.NET程序了~~~
關(guān)鍵詞:ApacheASP.NET

贊助商鏈接: