序论:关于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平台的一些体验,有什么不准确的地方请大家指正,也希望能给那些和我一样的新手朋友一点帮助!