周一到周三,折腾了两天半的时间,经历几次周折,在小蝶惊鸿的鼎力帮助下,终于在Mono 3.2.8上运行成功MVC4。在此总结经验如下:
系统平台的版本:
CentOS 6.5 Mono 3.2.8 Jexus 5.5.1
VS2012 英文Ultimate版 由于采用的是英文版本,因此下面图片也都是英文版的界面。
完成工作:制作一个完整的MVC4 Internet应用(本例不含数据库,数据库的访问在以后的文章中谈),将其部署在Linux + Mono + Jexus环境。
步骤:
1、使用 .NET Framework 4生成MVC4;
2、卸载EF;同时删除或注释与EF相关的应用;
3、发布;
按上述步骤的详细操作如下:
1、使用 .NET Framework 4生成MVC4
在生成MVC4时,目前情况下,一定要使用 .NET Framework 4,不要使用 .NET Framework 4.5,否则,由于 .NET Framework 4.5虽然很好很强大,但由于它太新,在Mono上运行至今我未找到有效的完整运行办法,包括Windows Server 2008,如果不安装最新的Service Pack,都无法支持 .NET Framework 4.5。
因此,如下图,在创建新项目时,请注意保证使用 .NET Framework 4(见图片上部中间),
我创建是一个完整的Internet应用,如下图:
2、卸载EF;同时删除或注释与EF相关的应用
从小蝶惊鸿的文章Linux.Net学习手记(5),知道需要卸载EF。到“工具”菜单找到NuGet操作命令窗口或者管理器界面,将EntityFramework卸载。
注意虽然EF卸载可以把Dll引用及根目录下的Web.config文件进行修改,但对于MVC4的Internet应用来说,里面有一些需要使用EF的代码却不会自动卸载,需要手动删除或者注释。因为自己既然想使用ASP.NET MVC4运行在Linux上,就不打算使用MS SQL Server数据库,而是使用MySQL数据库,访问MySQL方式采取ADO.NET。所以,EF相关代码可以全部屏蔽。
首先,把Models目录下的AccountModels文件删除;然后,将Controllers目录下的AccountController删除;
生成解决方案(Ctrl + Shift + B),下面会有一些错误提示(我的有7、8个左右),按照错误提示,把错误提示的代码注释即可,这些代码与创建用户有关,使用了EF;直到生成的解决方案没有错误,在VS下运行,确保通过;
3、发布
周折最多的地方就是发布了。最初,发布到本地文件系统,其设置是这样的:
注意“设置”中选择了两个选项:“发布前删除所有现有文件”和“在发布期间预编译”,结果这样的发布,到Linux上后,出现了奇怪的结果:如果Controller中的Action返回的是字符串,即return "Hello, MVC4";,这样的路由没有问题;但如果返回的是ActionResult,即return View();就会出现错误信息!
小蝶惊鸿参与这个问题的解决,发现如果把第二项“在发布期间预编译”选掉(如下图),生成的发布文件放到Linux后,上述问题就解决了!
至此,一个完整的MVC4应用就可以运行在Linux之上了。
特别需要说明的是:本文经验只适用于Mono 3.2.8,其它版本的Mono可以参考,但无法保证适用性,因为版本差异貌似很大。
本文所述过程详细参考了Linux.Net学习手记(5),在实际操作过程中,发现在自己的这个操作中,即使不在Web.config中加入<globalization culture="zh-CN" uiCulture="en-US"/>,同时也不对Microsoft.Web.Infrastructure.dll进行删除,MVC4运行也是正常的。估计这就是版本不同造成的差别吧。
感谢小蝶惊鸿、张善友和Jexus服务器作者宇内流云,他们的文章对我将.NET应用到Linux上帮助很大。
实际网站在Linux运行成功后,再与大家分享。