.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里面做如下处理:

.NET移植Mono初体验

在Windows里面测试没有任何问题,但是在Ubuntu11.10 运行时问出现如下问题:

在地址栏我直接输入要访问的Main.aspx,跳转回来的地址如图所示:

.NET移植Mono初体验

从登录界面登录会产生如下错误:

.NET移植Mono初体验

在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里面编译也是完全通过,运行会报如下错误:

步骤:登录--退出--登录

.NET移植Mono初体验

退出之后再登录会报错:

.NET移植Mono初体验

刚开始对这个错误会不知所错,我一开始以为是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平台的一些体验,有什么不准确的地方请大家指正,也希望能给那些和我一样的新手朋友一点帮助!

上一篇:Windows PowerShell初体验——.NET对象支持


下一篇:Linux文件与目录的三种时间状态(mtime,atime,ctime)区别