以levenblog為例,嘗試在linux+mono平台上部署asp.net mvc程式

來源:互聯網
上載者:User

    一直以來都十分關注mono的發展,在不久之前,mono正式發布了2.6.1版本,該版本已經是一個比較完善的版本了,不僅完整支援了.net2.0的全部內容,大部分.net3.5甚至還支援了.net4.0的內容(可選),在mono官方已經包含了asp.net mvc1.0版本,因此,部署levenblog到mono的條件完全成熟,不過由於linux和windows的差異,因此,也並不是所有程式都可以直接部署的,本次將完整記錄levenblog部署到mono2.6.1的過程.

    首先給出伺服器平台,我測試了兩個平台,debian5 x86和debian5 x64,都通過源碼編譯的方式安裝了mono2.6.1,不過在安裝的時候,debian5 x64編譯mono出現莫名的錯誤(編譯器未給出任何有效錯誤資訊而錯誤),因此,改為checkout最新的源碼安裝成功).這樣應該能廣泛代表linux32位和64位平台了.就針對levenblog程式來說,以前的版本在mono是無法直接啟動並執行.經過初步的分析,存在以下一些問題:

  1. 本地路徑問題,這可能是大部分.net程式部署到linux+mono的一個最大問題,往往大家在windows上寫程式並不注意路徑,linux中使用"/"作為路徑分隔字元,但是windows確是"\",同時,如果程式中對路徑進行操作,手動拼接基本上都會出現問題,該問題的解決方案:拋棄手動拼接本地路徑的做法,改用Path.Combine方法來進行和平台無關的路徑操作,levenblog中存在該問題的地方主要是skin選擇程式和上傳程式.
  2. 仍然是路徑問題,不過這次是虛擬路徑問題,主要問題在於使用master page的檔案,levenblog的view中大量使用master page,預設的引用方式為"../shared/blog.master",然而,這種模式在mono中將無法解析,提示路徑錯誤,原因好像是它並不是使用master page的實際路徑來分析相對路徑,而是採用url路徑進行解析,而mvc應用中,url和實體路徑並不相同,於是導致路徑報錯,這應該也算是一個mono和.net不相容的問題,解決的方式是引用master page的時候一律採用~/xxx的方式,比如~/skins/default/shared/blog.master,不過這種方式會規定死了相對路徑,因此,skin的目錄將不能被改名,否則系統也無法找到該檔案.
  3. 仍然是路徑,果然mono移植最大的問題還是路徑,這次出現問題的web.config中的外部參考,因為設定檔過大,levenblog將log,route,高亮等設定檔分離,並在web.config中包含,在windows中我們只能採用<routeConfigure configSource="config\route.config" />這樣的模式,然而,在linux+mono中,這樣的路徑被認為是"config\route.config"檔案,這是因為\在linux中是合法檔案字元,因此,在linux+mono中,該處應該改為<routeConfgure configSource="./config/route.config" />不過這樣的配置方式可別指望在windows下工作,windows下的exception明確表示,設定檔路徑包含必須是相對路徑且不能包含字元'/',因此,針對兩個不同的環境levenblog得準備不同的web.config檔案.
  4. 關於native dll-sqlite3.dll的處理,很顯然,sqlite3.dll是windows上的dll檔案,是無法在linux上啟動並執行,而System.Data.SQLite.dll是會通過DllImport匯入sqlite3.dll中的函數,同時,mono上的連結庫檔案也絕不會取名為*.dll的模式,因此,mono採用了一種dllmap的配置方式來在內部進行轉向,於是,sqlite3.dll被映射至libsqlite3.so.0,不過很遺憾,debian5中通過apt-get安裝的libsqlite3.so.0是無法支援新版的System.Data.SQLite.dll的,會提示調用錯誤,因此,我們需要自己找最新的libsqlite3.so.0,對於32位系統,在sqlite的官方網站就提供了下載,具體地址為:http://www.sqlite.org/sqlite-3.6.22.so.gz (針對3.6.22),而64位版本需要自行進行編譯,由於本程式無需tcl支援,所以可以只下載基本的sqlite版本即可,地址為:http://www.sqlite.org/sqlite-amalgamation-3.6.22.tar.gz,編譯之後,在.libs目錄下可以看到"libsqlite3.so.0"檔案,為了不影響系統依賴,建議不要將該檔案覆蓋到/usr/lib,如果方便,可以放入/usr/local/lib或者bin目錄.然而,這樣操作了系統仍然無法找到正確的libsqlite3.so.0,這是因為linux上,無論是/usr/local/lib還是當前bin都不是lib的的搜尋路徑,為了讓mono執行前能搜尋到這些路徑,需要手動執行"export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH"將/usr/local/lib加入lib(注意,linux中環境變數用:間隔,如果將libsqlite3.so.0放入當前bin目錄,那麼需要將該目錄也加入到LD_LIBRARY_PATH路徑).經過這樣一番折騰,系統終於找到了正確的libsqlite3.so.0檔案,首頁總算完全開啟.
  5. 驗證碼問題,通過源碼安裝的mono,很可能出現驗證碼無法顯示的情況,出現這樣的情況,首先要檢查是否安裝了libgdiplus組件,如果沒有,請務必安裝該組件,它是系統System.Drawing組件工作的基礎,其2.6.1版本的為:http://ftp.novell.com/pub/mono/sources/libgdiplus/libgdiplus-2.6.tar.bz2,同時注意安裝前請保證系統已經安裝了基本的libjpeg,libgpng,libgif庫,否則安裝後也會出現這些格式的驗證碼無法顯示的情況,安裝成功後,還需要注意一定要將安裝路徑中的lib加入到系統lib搜尋路徑,比如我將該組件安裝到/usr/local/lib,那麼已經要將該路徑export到LD_LIBRARY_PATH中,否則系統找不到對應的庫,也會無法顯示.
  6. 檔案編碼問題,經過上面幾部基本頁面都能正常使用了,但是仍然有部分頁面出現了亂碼,經過檢查這些頁面使用了gbk編碼,將其改為utf-8,亂碼問題解決
  7. 檔案名稱大小寫問題,這也是一個部署經常出現的問題,在最開始的時候曾經出現一個"System.Data.SQLite.dll"無法找到的問題,通過錯誤排查,最後發現是bin中檔案名稱為Syste.Data.SQLite.DLL,大小寫差別導致mono無法載入該檔案而錯誤,同樣的,在頁面中,引用任何靜態檔案,路徑都必須保證大小寫一致,在levenblog中,這樣的不規則出現在css引用圖片中,經過修改,全部改成小寫,故障排除
  8. mono編譯器和微軟編譯器有個別不相容情況,對於levenblog,表現在行事曆群組件中,其中一行代碼如下
    startDate = startDate.AddDays(0 - startDate.DayOfWeek);
    mono下會提示DayOfWeek無法轉換為int,而微軟編譯器可以支援該轉換,改為
    startDate = startDate.AddDays(0 - (int)startDate.DayOfWeek);
    故障解決
  9. 個別API不支援,在admin/info.aspx中,調用了Cache.EffectivePrivateBytesLimit擷取伺服器可分配記憶體,但是該調用在mono中是不被支援的,仍然去掉,還好這樣的不相容還是極個別的.
  10. js中嵌入c#代碼會解析錯亂,這是目前發現mono最大的一個bug,在write.aspx中,部分js需要在其中嵌入c#代碼,結果運行之後導致輸出錯亂而js執行錯誤的情況,該問題目前沒有直接解決方案,通過變通,我新增了一個名為js的action用來處理js輸出,

    通過解決以上10個問題之後,levenblog終於成功在linux+mono的環境下運行起來,總的來說,移植並沒有出現很大的問題,

    我通過nginx+fastcgi-mono-server2的模式測試組態了一個levenblog運行環境,配置方法參考以上10點,測試地址為:http://leven.name/,歡迎有興趣的朋友進行測試.同時,在下一個levenblog版本發布時,我會提供完整穩定的linux+mono安裝包.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.