由於公司的產品在新的版本中,需要考慮一些新的部署方式,所以又抽空關注了一下.NET跨平台的一些解決方案。雖然Mono Project對基於.NET開發的人來說都不陌生,不過由於Mono是比較狹義的跨平台(因為它是OS層級的)概念。而從廣義的角度來說,使用不同的 Web Server也可以算是一種垮平台。
緣起是由於IIS的口碑實在太濫,以至於不少的關鍵應用情境明文禁止安裝和使用IIS。而從 ASP.NET的執行原理來看,它是通過一個Web Server處理tcp請求,然後把對ASPX執行和呈現交於使用.NET實現一個託管環境來進行的。所以使用Apache是目前最經濟的IIS替代品,而同時在Apache的sub-project正好有一個支援ASP.NET的模組,並且已經開發到了2.0版本。我所配合使用的版本是Apache HTTP Server 2.0.55和mod_aspdotnet 2.0.0。安裝非常的簡單,兩個程式都是msi安裝包,一路next就搞定了。完了再在安裝目錄/htdocs下建一個目錄,如:active。
不過其中有兩個小問題需要注意:
一是:在安裝Apache HTTP Server的時候,如果我們機器上的80連接埠已被佔用,需要選使用8080連接埠來安裝那個選項,當然這個連接埠是可以在httpd.conf檔案裡修改的。只是使用這種安裝方式安裝好以後需要手動的啟動apache2服務,使用cmd命令並進入apache安裝目錄,如:D:Program FilesApache GroupApache2bin,運行:
apache -k install。
二是:在配置aspdotnet_module的時候,我們需要在httpd.conf檔案中追加以下清單: #asp.net
LoadModule aspdotnet_module "modules/mod_aspdotnet.so"
AddHandler asp.net asax ascx ashx asmx aspx axd config cs csproj licx rem resources resx soap vb vbproj vsdisco webinfo
# Mount the ASP.NET example application
AspNetMount /active "J:/Working/BIVSS"
# Map all requests for /active to the application files
Alias /active "J:/Working/BIVSS"
# Allow asp.net scripts to be executed in the active example
Options FollowSymlinks ExecCGI
Order allow,deny
Allow from all
DirectoryIndex Default.htm Default.aspx
# For all virtual ASP.NET webs, we need the aspnet_client files
# to serve the client-side helper scripts.
AliasMatch /aspnet_client/system_web/(d+)_(d+)_(d+)_(d+)/(.*) "C:/Windows/Microsoft.NET/Framework/v../ASP.NETClientFiles/"
Options FollowSymlinks
Order allow,deny
Allow from all
本來這個設定檔很簡單,還有詳細的注釋。不過一定要注意上面的命令(非#開頭的行),都需要寫在一行上,如果是從網頁上copy要特別的小心,特別是AddHandler和AliasMatch這兩句容易被斷成兩行,那樣啟動 apache服務就會失敗,並且提示非常簡單,根本不會告訴你設定檔載入錯誤。
目前,這個mod_aspdotnet模組最大的問題是在認證支援上的不足,比如windows和form都還不能支援,不過開源的東西更新還是很快的。由於使用Microsoft .NET Framework作為CLR,開發更新的壓力和Mono不在一個數量級上,相信很快就能有對頁面認證的較好支援。
安裝成功後可以運行探針來檢查效果,比如使用邁克老貓同志的ASP.NET探針。