CASSINI源代碼分析(1) - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- CASSINI源代碼分析(1) (http://www.webasp.net/article/15/14869.htm) |
| -- 作者:未知 -- 發佈日期: 2004-11-16 |
| 為什麼要分析CASSINI?
Cassini(卡西尼)是asp.net上的一個開源項目。主要給出一個脫離IIS實現asp.net執行環境。項目演示了如何自己創建一個web server,並且運行一個asp.net應用程序。 研究 Cassini可以瞭解: 1、.net 環境下的web server如何實現,注意那些問題 2、asp.net的執行本質 3、瞭解appDomain的執行概念 安裝 沒有什麼問題,默認即可 運行 出現問題,主要是我的.net framework是1.0.3705 而 系統下載的經過編譯的cassini.dll是在v1.1.4322下編譯,更麻煩的是經過簽名的。所以啟動時候回提示找不到v1.1.4322的framework 而我的目標是想分析這個程序,該如何進行? 既然獲得了整個源代碼,我就應該從理論上熟悉並且可以掌握整個系統,我建立一個工程,將全部.cs文件和資源文件加入到一個項目,同時刪除原有項目默認的form1,因為CassiniWebServer.cs已經有一個main入口。 調試,解決問題 1、編譯OK,但是,無法啟動,原來缺少.ico文件。不是已經加入到工程了麼?原來,我們的編譯程序在bin\debug目錄下,所以我將CassiniWebServer..ico文件拷貝到bin\debug\下即可啟動 2、輸入asp.net應用程序根目錄、端口、執行點,OK,點擊Start,出現錯誤,好像告知我端口被佔用。不可能!我的80端口 8080端口都沒有被佔用,難道是有木馬?我用fport.exe查詢端口,發現根本沒有程序佔用。那究竟是什麼原因?好在可以啟動進行調試,我跟蹤到CassiniWebServer.cs的CassiniForm類的Start()函數,發現在以下代碼處發生錯誤 try { _server = new Cassini.Server(portNumber, _virtRoot, _appPath); _server.Start(); } catch { ShowError( "Cassini Managed Web Server failed to start listening on port " + portNumber + ".\r\n" + "Possible conflict with another Web Server on the same port."); portTextBox.SelectAll(); portTextBox.Focus(); return; } 也就是在創建server的時候出錯。 但是不利的是,源代碼並未交待錯誤原因,而是武斷的告訴我「Cassini Managed Web Server failed to start listening on port XXX」,顯然,是不慎重的(估計作者對Exception不感冒)。 為了深入瞭解原因,我加入了 catch (Exception e){ MessageBox.Show(e.ToString()); …… 這樣,就顯示了一個錯誤提示。原來是,在asp.net的創建應用域需要用到的程序集在私有目錄或者GAC中。之前安裝後,看到.snk證書文件就是為了簽名加密並拷貝到全局dll中的。但是我沒有這樣做,所以CLR會在啟動進程的當前目錄的子目錄bin\下尋找需要的程序集。而我將原本是兩個程序集的源碼集合到一個程序集,導致執行搜索程序集失敗。直到原因後,建立bin目錄,並拷貝編譯後的exe文件到asp.net的執行起點的bin目錄後,系統啟動OK. 3、測試,通過ie測試訪問,發現一切正常,就好像在IIS下運行一樣。 (待續) |
| webasp.net |