ASP.NET 跨平台最佳实践

前言

八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营。有过短暂的失落和迷茫,但技术转型真的没有想象中那么难。回头审视,其实单从语言本身来看,C#确实比Java更优秀(并非C#天生丽质,而是它站在了巨人的肩膀上)。

本文并非为.NET正名而来,而仅仅是分享作者近几年在ASP.NET跨平台方面的研究与实践经验,算是对八年的.NET之路作一个阶段性的总结。

.NET技术自诞生以来,便一直因其跨平台能力差而广受诟病。这里面有微软有意为之,也有别有用心之人在混淆视听。.NET在一开始便是按公开的语言规范进行设计,随着微软的逐渐妥协,.NET Framework已完全开源。.NET跨平台技术迎来了前所未有的机会,各种.NET跨平台技术必将如雨后春笋般涌现。本文将介绍作者在.NET跨平台方面的最佳实践经验,希望藉以降低.NET跨平台的技术难度,让.NET真正成为跨平台的生产技术。

环境

操作系统选择开源社区较有代表性的Linux服务器版本CentOS(本文所述的跨平台思路可以成功应用于绝大多数的Linux系统,也包括国产操作系统如中标麒麟);技术平台选择久负盛名的Mono;Web应用中间件选择中国制造的Jexus。涉及的环境与技术详细情况为:

  • 操作系统:CentOS_6.4_64bit
  • .NET框架:Mono_4.0.4.1
  • Web应用中间件:Jexus_5.6.5
  • 数据库:MySQL_5.1.73

目标

本文所述实践,将实现ASP.NET应用程序在Linux系统进行部署,并作产品化尝试,使ASP.NET应用在Linux平台易于部署和维护。

Web应用程序

本文的Web应用程序选用ASP.NET MVC 4技术开发,持久层选用ADO.NET Entity Framework 6技术。你可以在src/demo目录下找到它。

跨平台部署

一、安装系统

最小化安装CentOS系统。作为实验环境,可以考虑选用具有快照功能的虚拟机,作者选用的VMWare虚拟机进行试验。系统安装在此不再赘述。系统安装好后,做一个快照留待后续验证产品化安装包正确性所用。

如果你对跨平台部署ASP.NET应用的实现过程没有兴趣,只想看结果的话,可以直接跳过后续步骤,直接进入产品化章节的通过安装包部署ASP.NET应用部分。

二、搭建Linux编译环境

由于本文选择源码安装Mono,所以需要先搭建Linux编译环境。搭建Linux编译环境需要让系统连接互联网,并进行系统更新。

首先,需要让你的系统连接互联网。此处以VMWare虚拟机为例讲解如何连接互联网。VMWare虚拟机连接互联网的方式很多,作者选择NAT方式,首先需要将虚拟机网络连接方式设为NAT,如图 1所示。

1 VMWare虚拟机网络连接方式设置

设置VMnet8为自动获取IP,如图 2所示。

2 设置VMnet8为自动获取IP地址

然后将Linux虚拟机设为DHCP自动分配IP,编辑网卡配置文件:

修改该配置文件内容如下:

重启网络服务,让网卡设置生效:

确认虚拟机已连接互联网:

更新系统:

安装Mono源码安装需要的组件:

三、安装GDI+组件

安装Mono之前,需要先安装其依赖的GDI+组件。联网下载libgdiplus源码安装包(如果在Linux系统中直接下载源码包出现停滞的情况,请返回Windows系统下载libgdiplus源码安装包,并将其上传到Linux系统相应路径后进行安装。后续其他组件安装遇此情况与此雷同,不再赘述):

解压libgdiplus源码安装包:

配置libgdiplus组件安装路径(这里指定安装路径,是为后文产品化制作安装包做准备,Mono、Jexus和MySQL安装也是如此,不再赘述):

编译libgdiplus源码:

安装libgdiplus组件:

四、安装Mono

Mono是Linux平台的.NET Framework实现,是.NET程序移植到Linux平台的不二选择。首先,联网下载Mono源码安装包:

解压Mono源码安装包:

配置Mono安装路径:

编译Mono源码(此过程耗时一般为半小时到一小时,视系统软硬件配置而定):

安装Mono:

通过查看Mono版本,确认Mono是否安装成功(出现如下的版本信息表示Mono安装成功):

五、安装Jexus

Jexus是国人开发的Linux平台上的ASP.NET Web应用中间件,类似于Windows平台的IIS。实践证明Jexus安装简单,运行稳定,是Linux平台架设ASP.NET应用的不错选择。首先,联网下载Jexus安装包:

解压Jexus安装包:

修改Jexus安装路径:

安装Jexus:

修改Jexus关于mono路径的配置:

启动Jexus服务,测试Jexus安装是否正确:

设置Jexus服务开机自启动,增加如下高亮行::

修改该文件权限并重启:

六、部署网站

创建网站目录:

修改Jexus网站配置:

开放防火墙80端口:

重启iptables,使防火墙设置生效:

重启Jexus服务:

终端浏览器输入网址http://ip:port/index.html访问网站:

3 ASP.NET网站成功部署到Linux平台

七、数据库

Linux平台免费关系数据库首选当然是MySQL,首先下载MySQL源码安装包:

解压MySQL源码安装包到指定目录,并修改目录名称:

将mysql配置文件拷贝至指定目录:

编辑mysql配置文件,在[client]节和[mysqld]节中加入以下高亮行::

创建mysql组及用户,并设定目录访问权限:

初始化数据库:

运行mysql服务:

这种方式启动MySQL是阻塞式的,需要另开一个会话登录Linux系统,继续后续操作。

设置root用户密码:

设置mysql服务开机自动启动:

现在,可以停止之前会话启动的MySQL服务(快捷键Ctrl + C),使用service命令后台启动MySQL服务。

将mysql命令加入系统环境变量中,在文件末尾加上以下两行代码:

执行配置,并重启系统,让环境变量生效:

待Linux系统重启后,MySQL服务可以自动启动,MySQL命令也包含在了环境变量中。此时,MySQL服务已经可以在本地访问了,可以通过MySQL命令行创建数据库、执行SQL文件等操作。另外,可以通过MySQL命令行配置允许远程访问MySQL数据库(当网站服务和MySQL数据库服务在一起时,可以不进行该配置):

还需要防火墙开放3306端口,编辑防火墙规则文件,在防火墙规则文件中添加如下高亮行:

重启防火墙服务:

此时可以远程访问MySQL数据库了。

八、部署ASP.NET应用

本示例提供一个ASP.NET MVC应用,放置在后文制作的tar包webapps目录下,该示例通过Entity Framework实现数据库的自动创建及数据的增删改查。将该目录上传至Linux系统的/usr/apollo/webapps目录下,并配置Jexus网站配置:

Jexus支持承载多个Web站点,所以这里新增的demo站点和之前创建的default站点可以共存,仅需配置不同的端口号即可。同样的需要开放防火墙8080端口:

重启iptables,使防火墙设置生效:

重启Jexus服务:

现在可以在终端通过浏览器访问ASP.NET MVC站点了。

4 Linux环境部署ASP.NET MVC应用

产品化

通过上述一系列步骤,我们实现了ASP.NET MVC应用在Linux平台的部署,但这仅仅是技术预研,离产品化还有一定的距离。这一系列步骤技术性太强,需要联网,不易操作,这些对于生产和用户环境都是难于实现的。我们需要将.NET跨平台技术产品化,使得ASP.NET应用易于部署。

一、初始化脚本

如前文所述,ASP.NET应用在Linux平台部署需要设置防火墙策略、MySQL用户与分组、Jexus与MySQL服务开机自启动等,相当繁琐。我们可以将这些设置集中在一个初始化脚本里执行。

二、制作安装包

将Linux平台部署ASP.NET应用需要的技术包括Mono、Jexus、MySQL等集成并进行打包分发。

三、通过安装包部署ASP.NET应用

至此,Linux平台Web应用部署包已打好,将其下载到终端。将虚拟机恢复到初始安装快照状态,然后将终端上的部署包上传到Linux系统中并解压:

执行初始化脚本完成安装:

在终端通过浏览器访问ASP.NET MVC站点,确认部署成功。

5 Linux平台产品化部署ASP.NET MVC应用

总结

本文详细讲解了Linux平台部署ASP.NET应用的最佳实践过程,通过该实践过程了解了ASP.NET应用跨平台部署的方方面面,该过程同样适用于其他Linux分发版本和国产操作系统。另外,本文对Linux平台部署ASP.NET应用进行了产品化包装,制作的安装包可以直接应用于产品打包,你只需将应用放入指定目录即可。希望本文所阐述的技术对你有所帮助。

附件下载:示例源码+本文PDF版本

附件下载:产品化部署TAR包

其他最佳实践建议(持续更新)

  1. Mono对ASP.NET WebForm技术支持还不是很好,尽量不要选择ASP.NET WebForm技术,ASP.NET MVC技术是更好的选择;
  2. Mono似乎暂时不支持ValidateInputAttribute,所以如果你的Action需要禁用输入参数验证,需要在Web.config中增加“”全局配置;
  3. Mono似乎暂时不支持BundleConfig,所以不要用这种方式来绑定前台资源;
  4. 如果你用了Sping.NET IoC技术,你一定会爱上她针对ASP.NET MVC Controller的自动注入功能,但是目前在Mono上运行有问题,原因暂未查明,只能舍弃而改用传统的IObjectFactory.GetObject方法。
2 3 收藏 1 评论

相关文章

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部