asp.net在Linux下的开发与运行实践

近期由于一个项目需要,进行了将ASP.NET网站部署在Linux下的调研,并做了一些DEMO来进行测试。最后由于客户不接受在Linux上跑.net程序,我们的工作也只能做到这一步。记录在此,以便后续需要时好查阅。

由于我们项目使用了文件依赖缓存、推技术,故调研中对这些技术在Linux下是否能稳定运行有较多关注。

在此之前我们对于Linux的经验甚少,如果此文描述有错误之处,欢迎各位批评指正。

 

一:方案思路

采用在Linux环境下运行现有的***平台[.NET],数据库采用Oracle 10g

***目前于Windows平台上能稳定运行,我们可以使用Mono,通过一些代码及架构调整将***平台稳定、高效运行于Linux系统下。

 

二:Mono简介

Mono是一个由Novell公司(Ximian发起,并由Miguel de lcaza 领导的,一个致力于开创.NETLinux上使用的开源工程。它包含了一个C#语言的编译器,一个CLR的运行时,和一组类库,并实现了 ADO NETASP NET。能够使得开发人员在LinuxC#开发程序。)主持的项目.

该项目的目标是创建一系列符合标准ECMA (Ecma-334Ecma-335).Net工具, 包括C #编译器和共同语言(CL Common Language)执行平台(Platform).与微软的.Net不同, Mono项目不仅可以运行于Windows系统内,还可以运行于Linux, FreeBSD, Unix, Mac OS XSolaris

首页:

http://www.mono-project.com/Main_Page

 

三:Mono应用案例

目前Mono已经被国内外广泛使用,以下提供几个案例以做参考:

1.       中天证券

网址:http://www.stockren.com/

 

2.       东北师大附中

网址:http://www.msannu.cn

 

3.       四川省蓬溪县人民政府

网址:http://www.pengxi.gov.cn/

 

以上案例涵盖证券、教育、政府等多个行业。

 

以下是Mono官网上提到的众多使用Mono的成功案例:

http://www.mono-project.com/Software

 

四:运行环境

Linux  + apache2.2 + Mono2.10.8.1 + Oracle 10g,所使用的.net匹配版本为2.0版。

目前测试的Linux平台是Ubuntu,其他主流Linux下同样支持,部署方法大同小异。

Web服务器不局限于apache,可以换用Nginx,或者是咱们国人开发的Jexes,这几大Web服务器是目前使用较为广泛,性能较好的几个选择。

 

五:Linux下部署MonoApache

相关文章参考:

http://www.cnblogs.com/hcl0208/archive/2010/10/25/1860173.html

http://www.cnblogs.com/andhm/archive/2012/08/02/2619680.html

http://www.guanwei.org/post/LINUXnotes/01/ubuntuapache2configure.html

 

1. 安装apache2

apt-get install apache2

 

2. 安装Mono

使用的在界面上安装的办法,如果使用命令:

 

apt-get install mono-gmcs mono-xsp2 

apt-get install libapache2-mod-mono

apt-get install mono-apache-server2

 

sudo a2enmod mod_mono

 

3. 配置mono运行库

1)修改配置文件./etc/apache2/mods-available/mod_mono.conf  以达到可以显示控件

DirectoryIndex index.aspx

增加如下两行

MonoAutoApplication enabled

MonoServerPath "/usr/bin/mod-mono-server2"

2). 重启apache

sudo /etc/init.d/apache2 restart

 

4. 设置忽略大小写 [Ubuntu]

/etc/apache2/mods-enabled

1). 增加speling.conf

内容:CheckSpelling on

 

2). 增加 speling.load

内容:LoadModule speling_module /usr/lib/apache2/modules/mod_speling.so

 

5. apache设置虚拟目录

/etc/apache2下修改apache2.conf,在最后增加:

Alias /monotest/ "/var/www/monotest/"

    Options Indexes FollowSymLinks

    AllowOverride None

    Order allow,deny

    Allow from all

 

六:Linux下安装Oracle XE 10g及访问

1. 安装Oracle XE 10g

1). 下载oracle-xe-universal_10.2.0.1-1.0_i386.deb

2). 执行sudo dpkg -i oracle-xe-universal_10.2.0.1-1.0_i386.deb

3). 编辑/etc/profile,增加如下:

export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server

export LD_LIBRARY_PATH=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib

PATH=$LD_LIBRARY_PATH:$PATH:

export PATH

启动oracle xe 10g

sudo /etc/init.d/oracle-xe restart

 

2. Linux上安装Oracle XE 10g客户端

1). 下载oracle-xe-client_10.2.0.1-1.0_i386.deb

2). 执行sudo dpkg -i oracle-xe-client_10.2.0.1-1.0_i386.deb

3). 编辑/var/bin/mod-mono-server2,增加如下:

export LD_LIBRARY_PATH=/usr/lib/oracle/xe/app/oracle/product/10.2.0/client/lib:$LD_LIBRARAY_PATH

export NLS_LANG=AMERICAN_AMERICA.UTF8

重启apache

sudo /etc/init.d/apache2 restart

注:之所以采用下载离线安装包的办法,是因为在我家里的网络中,没有办法访问oracle的软件源信息。

下载地址如下:

http://115.com/355054741

 

七:Linux设置文件共享及缓存访问

1. 在共享服务器上安装nfsserver

sudo aptitude install nfs-kernel-server

 

2. 在访问客户机上安装client

sudo apt-get install nfs-common

 

3. 在服务器上添加共享的目录【设置好读写权限】

/home/web/sharedirtest 192.168.2.179(rw,sync,no_subtree_check)

 

4. 在服务器上启动NFS服务

sudo exportfs -r

sudo /etc/init.d/portmap restart

sudo /etc/init.d/nfs-kernel-server restart

 

5. 在客户机上加载此共享的目录

$sudo mount 主机IP:/home/yourname/sharedir ~/nfsshare

注意,nfsshare必须先存在

 

6. 读写缓存中的注意点。

mount目录后,即可按本地路径一样来进行使用,需要注意的是:缓存指定的文件需要有读写权限[chmod 777 dir -R],否则缓存无响应

另:通过共享目录的缓存,可能会有延迟。

 

可以采用两种方案:

1.oracle写本地文件, web读加载的共享目录

2.web读本地文件, oracle写加载的共享目录

 

测试发现在monodevelop下编译的访问共享的缓存正常,但WIN下编译的不生效

 

八:其他

设置开机启动:

sudo /etc/init.d/oracle-xe enable

 

添加连接文件:

sudo ln -s /etc/apache2/sites-available/chaichunyan  /etc/apache2/sites-enabled/chaichunyan

 

注:

apache的设置中,可以将配置放在任何一个文件中,只是为了便于管理,建议还是各自分开配置。

将相关的模块放于available中,需要启用时,在enable中添加链接即可。

 

mono下通过调用存储过程时构造参数的异常:

 

OracleParameter para = new OracleParameter("test", OracleType.Varchar);

会报异常,提示未将对象设置到实例:

http://mono.1490590.n4.nabble.com/System-Data-OracleClient-OracleParameter-SetOracleType-bug-td3855825.html[[BR]]

 

处理办法:

OracleParameter para = new OracleParameter();

para.ParameterName = "cur_OUT";

para.Value = 1;

para.OracleType = OracleType?.Cursor;

 

提供了一个测试的DEMO,可以在此下载:http://download.csdn.net/detail/tragicguy/5430001

 

你可能感兴趣的:(mono)