.NET移植Mono初體驗
序論:關於mono的介紹可以猛擊這裡瞭解!如果你因為licence的問題而對mono望而卻步,你可以仔細看下這裡,之後你就會大膽的去用了!
最近為了練習做了一個簡單的三層架構的資訊管理系統,除了CRUD操作就是登入和登出。一開始我的想法就很明確,做完了就Porting到mono下執行。
為什麼這裡會要Porting呢,而不是直接在linux下面藉助monodevelop開發。原因很簡單,monodevelop相對我們用習慣了的VS05-10裡面
的任何一個版本,我們都會覺得.net開發人員如此幸運,有Visual Studio這麼方便的IDE。相對VS而言,monodevelop的確比較那啥,用過的都知道!
所以用VS開發,完了放到monodevelop下編譯下,然後部署到linux伺服器執行是不錯的選擇。
本文:在移植過程中遇到了三個問題。
1.Response.Redirect()裡面的URL的問題。
問題重現:一般為了判斷使用者是否登入並在使用者登入後跳轉到之前請求的頁面,會在BasePage裡面做如下處理:
在Windows裡面測試沒有任何問題,但是在Ubuntu11.10 執行時問出現如下問題:
在位址列我直接輸入要訪問的Main.aspx,跳轉回來的地址如圖所示:
從登入介面登入會產生如下錯誤:
在Ubuntu裡面,Response.Redirect()裡面的URL會多加127.0.0.1:8080,所以報錯也很正常。
解決的方法:取backUrl為相對路徑,string backUrl=Request.RawUrl;
2.登出/退出時的Session處理問題
登出/退出功能雖然很小,但是扔有許多細節的地方需要注意。在vs開發時,跟大多數同學一樣,程式碼如下:
Session["UserName"]=null;
Session.abandon();
Response.Redirect("登入頁面URL");
同樣在Windows裡面沒有任何問題,就是在monodevelop裡面編譯也是完全通過,執行會報如下錯誤:
步驟:登入--退出--登入
退出之後再登入會報錯:
剛開始對這個錯誤會不知所錯,我一開始以為是monodevelop自帶的XSP4的伺服器有問題,但是當我部署到
Nginx上執行仍然報同樣的錯誤。仔細看異常資訊,可以發現是Session出了問題,所以很快定位可能是登出操作
Session.Abandon()引起的,將Session.Clear()後,一切都好了。關於Session.Abandon()MSDN是這樣描述:
一旦呼叫 Abandon 方法,當前會話不再有效,同時會啟動新的會話。 Abandon 導致引發 End 事件。
傳送下一次請求後將引發新的 Start 事件。預設條件下,已放棄或過期會話的會話識別符號將被回收。
也就是說,如果傳送的請求包含了某個已過期或放棄會話的會話識別符號,將使用相同的會話識別符號啟動新的會話。
僅當 Mode 屬性被設定為 InProc 時,才引發 End 事件。
我猜想這裡應該是mono對Session管理的機制和.net不同造成的,至於具體是什麼原因,我也不清楚,還請
路過的大牛指導。
3.mono裡面的checkboxlist控制元件是不能儲存值的。
這個問題我部署到vps上測試時發現的,在.net裡面是沒有問題的。但是在mono裡面提交時,checkboxlist的值會丟失,所以最後不得不改成多個checkbox。這個應該是mono的一個bug。
以上就是這次我移植到mono平臺的一些體驗,有什麼不準確的地方請大家指正,也希望能給那些和我一樣的新手朋友一點幫助!