ASP.NET MVC3 on Mono的折騰(一):Windows下的部署
Mono 2.10支持MVC3和Razor的消息著實讓我興奮了好一會兒,因為支持MVC3后,我就有可能做Kooboo CMS3兼容Mono的相關測試工作。可是沒一會兒,我就發現,離我的目標還是有一點距離。不曉得是Mono 2.10本身存在的bug,還是我的原因,我總是無法很完美的在Mono運行起MVC3的站點,即使是用默認的MVC3站點模板創建的非常簡單的站點也是一樣。長期生活在微軟Windows/.NET平臺的滋潤環境中,沒有Linux平臺的使用經驗和基于配置文件的Web部署習慣,讓我花了不少的時間來解決原本很簡單的問題的。從使用XSP失敗,到折騰Windows下使用Nginx+FastCGI來Host ASP.NET MVC3站點,之后再花了半個周末如癡如醉的研究openSUSE下的Mono部署。雖然沒有解決MVC3的運行問題,但是總算還是搞清楚了如何在Mono部署ASP.NET站點,以及簡單的linux平臺(openSUSE)操作。下面就簡單的記錄一下這些艱難歷程:
環境準備
在VS2010,用默認的MVC3站點模板創建一個簡單MVC站點,有簡單的首頁和登錄頁面,并且在Bin下面要私有部署MVC3的相關依賴程序集除了Microsoft.Web.Infrastructure.dll。站點下載。
1.使用Mono 2.10的XSP服務器失敗
Mono支持跨平臺,當然包括Windows平臺,而且在Windows平臺下面,它也提供了一種非常簡單的方式來讓我們方便的通過Mono啟動Web站點,就這是XSP。在Mono安裝成功之后,它會在目錄的右鍵菜單中增加一個菜單項“XSP 2 Web Server Here 2.10”,而我們只需要簡單的選擇這個菜單項就可以將目錄作為Web站點用Mono運行起來。而這里的XSP2,表示,我們使用的是ASP.NET 2.0,如果你需要用ASP.NET 4.0,那你可以通過修改注冊表的方式再增加一個類似的菜單項,只是把執行的批處理由xsp2.bat改為xsp4.bat就行了。這原本是最為簡單的測試方案,而且我使用Mono2.8來啟動MVC2站點也是沒有任何問題。結果在Mono 2.10中,XSP的站點死活就是不響應,那個請求讓他運行一萬年,它也是在那邊loading,也不timeout。問題通過各種努力,最終無力解決。
2.在Windows平臺下使用Nginx+FastCGI-mono-server架起MVC3站點,但是表單提交后,ModelBinder無法正常綁定Action Model.
XSP行不通,只能想其它辦法。在嘗試了在Windows使用Apache失敗之后,選擇了Nginx+FastCGI來架構ASP.NET站點。在園子里面找到這篇介紹在Mono架設ASP.NET站點,不過根據這篇文章我始終沒有搞明白具體如何配置,好像很復雜的樣子,還要下載它提供的文件,嘗試無果。幸好在Mono的官方站點找到Nginx的Mono配置文件,不過是Linux下面的配置。沒關系,看那配置也就那幾個步驟,應該很簡單。期間也遇到過一些問題,不過都順利解決,下面簡單記錄一下Nginx+Mono在Windows下部署ASP.NET站點的步驟:
1)從Nginx 的官方網站下載最新的Nginx軟件,純綠色,無需安裝。下載之后,解壓到某一目錄,這里是:E:\Mono\nginx-0.9.4
2)為了方便,把你的ASP.NET站點,也拷到Nginx目錄下面,我這邊使用的目錄名稱是:Mono_MVC3
3)進入conf目錄下,找到nginx.conf,找到location /{},我們把這段配置改為我們自己的值:
root Mono_MVC3;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
原本應該是還有一行fastcgi_index Default.aspx,用來設置默認頁面; 但因為我這里是Host MVC站點,所以去掉這行配置。如果沒有去掉這行,站點的根目錄將會無法訪問。
4)部署MVC站點,除了去掉默認首頁設置之外,還需要在conf目錄下找到fastcgi_params這個文件,在文件最后加上下面兩行配置:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
5)需要配置的部分都已經結束。下面就可以Mono FastCGI Server,這個命令行稍有差錯,就會讓我們的站點無法站點,結合了各方資料,我自己可以正常工作的命令行是:
D:\Program Files\Mono-2.10\bin>fastcgi-mono-server4 /socket=tcp:127.0.0.1:9000 /root="E:\Mono\nginx-0.9.4\Mono_MVC3" /applications=/:. /multiplex=True /port=8080
6)最后一步,運行:nginx.exe。注意,只需要雙擊運行就可以了,雙擊就會在后臺執行,不用在命令行下面運行。
以上就是Nginx+Mono在Windows下面最詳細的配置步驟了。正常情況下,這時候我們只要訪問Http://localhost:8080,站點應該就可以正常工作了。但是,因為Mono 2.10和MVC3,我還是遇到問題了:
1)每次FastCGI-Mono-Server第一次解析站點,都會出錯,只要你刷新一下頁面就可以正常訪問了。
2)當我們重定向到登錄頁,輸入用戶名密碼之后提交,又會遇到另外一個問題,Action無法被執行:
其實,在我最開始的嘗試中(另一臺機器),是不會拋出異常的,提交過程正常,但是會提示你沒有輸入用戶名/密碼,也就是LogOnModel的屬性沒有通過ModelBinder正確綁定。我目前也搞不清楚是不是在官方的下載中,提供了不同的編譯版本。
在Windows下的部署,總算是有一個可以成功了,可是仍然還是存在運行不正確的問題。于是把目光投到Linux下面,看看Linux下面的部署會不會正確 ,畢竟Mono的主要部署場景還是在非Windows平臺下。