mvc3部署到mono上面遇到的问题
1、經過實驗,發現mono下只要是post請求,就無法通過Request獲取值,因為Request.Form.Keys.Count總是為0,拋開apache直接運行xsp4也存在同樣的問題,由于MVC版HttpContext的獲取在MVC3的相關類庫中進行,而System.Web.Mvc是私有部署的,所以問題要么發生在mono的System.Web的實現中,要么發生在XSP中,經過了痛苦的搜索,有人提到mono中不能使用DefaultModelBinder,也有人提到mono當前還不足以完全支持MVC3,但如果HttpContext中根本就沒有初始化POST請求的數據,無論誰的ModelBinder都無法拼出一個Model來。后來,終于在mono的BUG更正列表中發現了一些蛛絲馬跡,在mono 2.10.2的Release notes頁,BUG683339提到:
683339: POST variables are not transferred to HttpContext.Request.Params nor FormCollection in MVC3 appmono2.10.2之前的版本中,POST數據都無法在MVC3中讀取,在更新了mono2.10.2后,ModelBinder果然正常工作。
2、則是windows和linux下路徑的"\"和"/"的差異引起的IO異常,其實從windows環境下遷移到linux+mono中時,有80%的問題都集中在URL大小寫和windows/linux的路徑問題上。這個異常向上追蹤可在Stack Trace中看到這樣一條信息:
at PanGu.Dict.WordDictionary.LoadFromBinFile (string,string&) <IL 0x00014, 0x00089>? 推測是盤古分詞在讀取詞典時的路徑中使用了硬編碼的路徑分隔符,通過Reflector定位到該方法,果然看到了這樣的代碼:
public string GetDictionaryPath() {string dictionaryPath = this.DictionaryPath;string currentDirectory = Directory.GetCurrentDirectory();Directory.SetCurrentDirectory(Path.GetAssemblyPath());dictionaryPath = Path.GetFullPath(dictionaryPath);Directory.SetCurrentDirectory(currentDirectory);return Path.AppendDivision(dictionaryPath, '\\'); //<----------此處使用了硬編碼的路徑分隔符 }? ? 于是下載了盤古分詞的源碼,更改其中的詞典路徑為從配置文件中讀取,重新編輯部署了Pangu.dll后,果然可以正常搜索。這也教訓我們,應該養成良好習慣,盡可能少地使用硬編碼,多考慮代碼在多環境下的適用性。
以上是使用mono的點滴Debug經驗,可能有很多人也會遇到同樣的問題,希望有所幫助。
順道宣傳一下,經過多輪壓力測試,發現其實mono的性能一點也不差,如果真有疑惑,相信科學,相信實驗,自己試試就知道了。
?
還有在mvc部署到mono上面時是嚴格區分大小的
轉載于:https://www.cnblogs.com/win-and-first/archive/2012/10/23/mono_mvc.html
總結
以上是生活随笔為你收集整理的mvc3部署到mono上面遇到的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: item21
- 下一篇: 一步一步学习 iOS 6 编程(第四版)