最近一直想體驗下mono在web開發(fā)上到底進展到什么程度,挑戰(zhàn)一下它對web開發(fā)的極限。因為asp.net mvc本身依賴windows平臺的東西不太多,所以這些assembly移植到mono/linux上來應(yīng)該不是大問題。網(wǎng)上很多人很早也介紹了相關(guān)主題,但是他們大部分是基于這樣的模式:在Visual Studio里開發(fā)asp.net mvc網(wǎng)站,然后再部署到linux上。我個人覺得這種做法只能驗證mono運行時有支持asp.net mvc的能力,這個確實也在mono 2.10的release note里提到了。但是如果想要在linux上開發(fā)asp.net mvc網(wǎng)站怎么辦呢?有同學(xué)會說:那在linux上裝個虛擬機做開發(fā)吧~~
本文我將會介紹怎樣在linux上用用monodevelop開發(fā)一個簡單的asp.net mvc3網(wǎng)站。asp.net mvc3是mono運行時目前支持的最新的版本,這個版本相對2比較成熟點 。然后會介紹我在這個過程中碰到的一些問題以及解決辦法。從下面這個截圖,我們可以知道請求是從ubuntu Chromium/28.0.1500.52上發(fā)出的,我本機是linux mint,屬于ubuntu系的,再查看response,可以知道asp.net版本是4.0.30319,mvc版本是3.0,我用的開發(fā)服務(wù)器是Mono.WebServer.XSP/3.0.0.0。
既然我們的目的是帶有探索性的,那么我采用的是最近的源碼,從github上我獲取了3個項目:mono,monodevelop,xsp。第一個是mono運行時,第二個是IDE,第三個是開發(fā)版Web服務(wù)器。我會把所有的這些項目都安裝到/usr/local目錄下,以免跟從軟件源里安裝的版本沖突,另外,因為畢竟是不穩(wěn)定版本,如果貿(mào)然裝到/usr下的話,系統(tǒng)也不穩(wěn)定。首先編譯mono運行時,這個可以參考我以前的一篇文章 在Linux Mint13下編譯安裝mono運行時 。接下來就是編譯IDE,不出意外您也應(yīng)該跟我一樣碰到一些編譯錯誤,主要是由于引用的DLL找不到引起的。很多依賴的csharp binding assembly找不到,例如,glib-sharp,gtk-sharp等,解決方法就是把這些assembly的pc文件從/usr/lib/pkgconfig下拷貝到/usr/local/lib/pkgconfig。下面看看gtk-sharp-2.0的pc文件的一部分,我們看它的第一行prefix是一個相對值,在拷貝到/usr/local/lib/pkgconfig之后,gtk-sharp.dll在/usr/local下仍然找不到,因此需要把它變成一個絕對路徑prefix=/usr。
然后我把我這邊/usr/local/lib/pkgconfig目錄下所有的pc文件截個圖出來
等build通過后,在monodevelop目錄下運行make run,這樣就啟動IDE了。
我用gtksharp拖出了個簡單的界面,編譯,運行,調(diào)試,都可以的。神器阿~~~~
接下來再編譯xsp的源碼。我本打算用源里的那個xsp,但是編譯出來的IDE總是報找不到xsp,這個我就沒有深究,因為可以yy的原因?qū)嵲谔,不想浪費時間調(diào)查這個。所以就決定自己編譯xsp。沒想到編譯相當(dāng)順利并且快(1分鐘左右在我機器上),出乎意料。xsp源碼里自帶了一個測試用的asp.net網(wǎng)站,然后我切換到目錄/usr/local/lib/xsp/test目錄下運行xsp4,服務(wù)器在端口9000上起來了。
在瀏覽器中輸入localhost:9000,很cool,asp.net網(wǎng)站在linux上運行了。但是有些asp.net web控件顯示錯誤,例如menu,grid。因為這些控件的實現(xiàn)依賴gdi+,所以我從源里安裝libgdiplus,也需要把它的pc文件拷貝到/usr/local/lib/pkgconfig下。這樣,整個test網(wǎng)站顯示都沒問題了。
接下來在IDE中建asp.net mvc項目,簡單起見,先從v2開始。這個過程沒啥問題,xsp正常啟動,網(wǎng)站能夠瀏覽,目前能調(diào)試時動態(tài)修改代碼但不能立即生效,問題不大。然后做v3,問題來了。第一就是項目的引用DLL System.Web.Helpers.dll和System.Web.WebPages.dll 就標(biāo)紅,提示找不到。System.Web.Helpers.dll確實在mono運行時里沒有,然后我看了一下這個DLL的實現(xiàn),認為它沒啥大關(guān)系,所以就直接刪掉了。System.Web.WebPages.dll在/usr/local/lib/mono/4.5下是有的,并且也在gac下注冊了,并且我項目的targetFramework也是指定的4.5,它標(biāo)紅就有點想不通了,有知道答案的同學(xué)請通知一聲。后來我也把它刪掉了,但是必須把System.Web.WebPages.dll拷貝到項目的bin目錄下,因為razor在解析頁面的時候需要用到它,否則頁面也展現(xiàn)不出來。這個后面會說。接下來的一個問題更頭痛,xsp在mono 4.5下怎么也啟動不起來。在v2時,因為目標(biāo)framework默認是4,所以沒問題。好在所有涉及到的代碼都可以直接調(diào)試,發(fā)現(xiàn)xsp服務(wù)器在初始化asp.net運行時時Configuration沒有重新初始化好,一讀appSettings就報錯。后來把target framework改成4就沒問題了。終于,網(wǎng)站可以訪問了,但是頁面展現(xiàn)時報錯,網(wǎng)頁上的錯誤信息非常模糊,說Home/Index.cshtml找不到,我了個去,明明在那兒阿,挑戰(zhàn)理解極限阿~~~繼續(xù)調(diào)戲,注意是被調(diào)戲~~~原來web.config里有幾個引用的assembly沒找到,我刪除了System.Web.Helpers.dll的引用。然后System.Web.WebPages.dll的版本不是1.0而是2.0。如果大家有什么問題歡迎交流。