當前位置:開發者網絡 >> 技術教程 >> .NET教程 >> 面向對像編程 >> 內容
精彩推薦
分類最新教程
分類熱點教程
    
CASSINI源代碼分析(1)
作者:未知
日期:2004-11-16
人氣:
投稿:snow(轉貼)
來源:未知
字體:
收藏:加入瀏覽器收藏
以下正文:
為什麼要分析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下運行一樣。



(待續)

相關文章: