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所示。

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

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

  1. [root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

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

  1. DEVICE=eth0
  2. HWADDR=00:0C:29:F5:09:30
  3. TYPE=Ethernet
  4. UUID=74b949f0-57bb-4baa-a5f2-2c97fb533a8b
  5. ONBOOT=yes
  6. NM_CONTROLLED=yes
  7. BOOTPROTO=dhcp

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

  1. [root@localhost ~]# service network restart

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

  1. [root@localhost ~]# ping yilin.cnblogs.com
  2. PING yilin.cnblogs.com (42.121.252.58) 56(84) bytes of data.
  3. 64 bytes from 42.121.252.58: icmp_seq=1 ttl=128 time=77.7 ms
  4. 64 bytes from 42.121.252.58: icmp_seq=2 ttl=128 time=78.1 ms
  5. 64 bytes from 42.121.252.58: icmp_seq=3 ttl=128 time=77.5 ms

更新系统:

  1. [root@localhost ~]# yum y update

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

  1. [root@localhost ~]# yum -y install wget glib2-devel libtiff libtiff-devel libjpeg libjpeg-devel giflib giflib-devel libpng libpng-devel libX11 libX11-devel freetype freetype-devel fontconfig fontconfig-devel libexif libexif-devel gcc-c++ gettext unzip zip

三、安装GDI+组件

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

  1. [root@localhost ~]# cd /usr
  2. [root@localhost usr]# wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.tar.bz2

解压libgdiplus源码安装包:

  1. [root@localhost usr]# tar jxvf libgdiplus-2.10.tar.bz2

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

  1. [root@localhost usr]# cd libgdiplus-2.10
  2. [root@localhost libgdiplus-2.10]# ./configure --prefix=/usr/apollo/hostd/mono/

编译libgdiplus源码:

  1. [root@localhost libgdiplus-2.10]# make

安装libgdiplus组件:

  1. [root@localhost libgdiplus-2.10]# make install

四、安装Mono

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

  1. [root@localhost libgdiplus-2.10]# cd /usr
  2. [root@localhost usr]# wget http://download.mono-project.com/sources/mono/mono-4.0.4.1.tar.bz2

解压Mono源码安装包:

  1. [root@localhost usr]# tar jxvf mono-4.0.4.1.tar.bz2

配置Mono安装路径:

  1. [root@localhost usr]# cd mono-4.0.4
  2. [root@localhost mono-4.0.4]# ./configure --prefix=/usr/apollo/hostd/mono

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

  1. [root@localhost mono-4.0.4]# make

安装Mono:

  1. [root@localhost mono-4.0.4]# make install

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

  1. [root@localhost mono-4.0.4]# cd /usr/apollo/hostd/mono/bin/
  2. [root@localhost bin]# ./mono -V
  3. Mono JIT compiler version 4.0.4 (Stable 4.0.4.1/5ab4c0d Fri Oct 30 06:56:35 CST 2015)
  4. Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
  5. TLS: __thread
  6. SIGSEGV: altstack
  7. Notifications: epoll
  8. Architecture: amd64
  9. Disabled: none
  10. Misc: softdebug
  11. LLVM: supported, not enabled.
  12. GC: sgen

五、安装Jexus

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

  1. [root@localhost ~]# cd /usr
  2. [root@localhost usr]# wget http://www.linuxdot.net/down/jexus-5.6.5.tar.gz

解压Jexus安装包:

  1. [root@localhost usr]# tar zxvf jexus-5.6.5.tar.gz

修改Jexus安装路径:

  1. [root@localhost usr]# cd jexus-5.6.5
  2. [root@localhost jexus-5.6.5]# vi install
  3.  
  4. #!/bin/sh
  5.  
  6. SRC_DIR=$(cd $(dirname $0);pwd)
  7. DAT_DIR=${SRC_DIR}/data
  8. JWS_DIR='/usr/apollo/hostd/jexus'

安装Jexus:

  1. [root@localhost jexus-5.6.5]# sudo ./install

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

  1. [root@localhost jexus-5.6.5]# cd /usr/apollo/hostd/jexus
  2. [root@localhost jexus]# vi jws
  3.  
  4. #!/bin/sh
  5.  
  6. JWS_HOME=$(cd $(dirname $0);pwd)
  7.  
  8. export LANG="zh_CN.UTF-8"
  9. export PATH=/usr/bin:${JWS_HOME}/../mono/bin:$PATH
  10. export LD_LIBRARY_PATH=/usr/lib:${JWS_HOME}/../mono/lib:$LD_LIBRARY_PATH

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

  1. [root@localhost jexus]# ./jws start

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

  1. [root@localhost jexus]# vi /etc/rc.d/rc.local
  2.  
  3. touch /var/lock/subsys/local
  4. /usr/apollo/hostd/jexus/jws start

修改该文件权限并重启:

  1. [root@localhost jexus]# chmod +x /etc/rc.d/rc.local

六、部署网站

创建网站目录:

  1. [root@localhost jexus]# cd /usr/apollo/
  2. [root@localhost apollo]# mkdir webapps
  3. [root@localhost apollo]# cd webapps/
  4. [root@localhost webapps]# mkdir default
  5. [root@localhost webapps]# cd default/
  6. [root@localhost default]# touch index.html
  7. [root@localhost default]# vi index.html
  1. <html>
  2. <head>
  3. <title>ASP.NET跨平台最佳实践</title>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. </head>
  6. <body>
  7. ASP.NET跨平台最佳实践,看到该页面,表示你的第一个网站已成功部署到Linux系统。
  8. </body>
  9. </html>

修改Jexus网站配置:

  1. [root@localhost default]# cd /usr/apollo/hostd/jexus/siteconf
  2. [root@localhost siteconf]# vi default
  3.  
  4. ######################
  5. # Web Site: Default
  6. ########################################
  7.  
  8. port=80
  9. root=/ /usr/apollo/webapps/default
  10. hosts=* #OR your.com,*.your.com

开放防火墙80端口:

  1. [root@localhost siteconf]# vi /etc/sysconfig/iptables
  2.  
  3. # Firewall configuration written by system-config-firewall
  4. # Manual customization of this file is not recommended.
  5. *filter
  6. :INPUT ACCEPT [0:0]
  7. :FORWARD ACCEPT [0:0]
  8. :OUTPUT ACCEPT [0:0]
  9. -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  10. -A INPUT -p icmp -j ACCEPT
  11. -A INPUT -i lo -j ACCEPT
  12. -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
  13. -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
  14. -A INPUT -j REJECT --reject-with icmp-host-prohibited
  15. -A FORWARD -j REJECT --reject-with icmp-host-prohibited
  16. COMMIT

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

  1. [root@localhost siteconf]# /etc/init.d/iptables restart

重启Jexus服务:

  1. [root@localhost siteconf]# /usr/apollo/hostd/jexus/jws restart

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

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

七、数据库

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

  1. [root@localhost siteconf]# cd /usr
  2. [root@localhost usr]# wget http://downloads.mysql.com/archives/get/file/mysql-5.1.72-linux-x86_64-glibc23.tar.gz

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

  1. [root@localhost usr]# tar zxvf mysql-5.1.72-linux-x86_64-glibc23.tar.gz -C /usr/Apollo
  2. [root@localhost usr]# cd apollo
  3. [root@localhost apollo]# mv mysql-5.1.72-linux-x86_64-glibc23 data

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

  1. [root@localhost apollo]# cd data
  2. [root@localhost data]# cp support-files/my-medium.cnf /etc/my.cnf

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

  1. [root@localhost data]# vi /etc/my.cnf
  2.  
  3. [client]
  4. #password = your_password
  5. port = 3306
  6. socket = /tmp/mysql.sock
  7. default-character-set = utf8
  8.  
  9. # Here follows entries for some specific programs
  10.  
  11. # The MySQL server
  12. [mysqld]
  13. port = 3306
  14. socket = /tmp/mysql.sock
  15. skip-locking
  16. key_buffer_size = 16M
  17. max_allowed_packet = 1M
  18. table_open_cache = 64
  19. sort_buffer_size = 512K
  20. net_buffer_length = 8K
  21. read_buffer_size = 256K
  22. read_rnd_buffer_size = 512K
  23. myisam_sort_buffer_size = 8M
  24. basedir = /usr/apollo/data
  25. datadir = /usr/apollo/data/data
  26. character-set-server = utf8
  27. collation-server = utf8_general_ci

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

  1. [root@localhost data]# groupadd mysql
  2. [root@localhost data]# useradd -g mysql mysql
  3. [root@localhost data]# chown -R mysql .
  4. [root@localhost data]# chgrp -R mysql .
  5. [root@localhost data]# chown -R root .
  6. [root@localhost data]# chown -R mysql data

初始化数据库:

  1. [root@localhost data]# scripts/mysql_install_db --user=mysql

运行mysql服务:

  1. [root@localhost data]# bin/mysqld_safe --user=mysql &

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

设置root用户密码:

  1. [root@localhost data]# bin/mysqladmin -uroot password 11111111

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

  1. [root@localhost data]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
  2. [root@localhost data]# chmod 700 /etc/init.d/mysqld
  3. [root@localhost data]# chkconfig --add mysqld
  4. [root@localhost data]# chkconfig --level 345 mysqld on

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

  1. [root@localhost data]# service mysqld start

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

  1. [root@localhost data]# vi /etc/profile
  2.  
  3. ...
  4. PATH=$PATH:/usr/apollo/data/bin
  5. export

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

  1. [root@localhost data]# source /etc/profile

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

  1. [root@localhost ~]# mysql -uroot -p11111111
  2. mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '11111111' WITH GRANT OPTION;
  3. mysql> FLUSH PRIVILEGES;
  4. mysql> exit;

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

  1. [root@localhost ~]# vi /etc/sysconfig/iptables
  2.  
  3. # Firewall configuration written by system-config-firewall
  4. # Manual customization of this file is not recommended.
  5. *filter
  6. :INPUT ACCEPT [0:0]
  7. :FORWARD ACCEPT [0:0]
  8. :OUTPUT ACCEPT [0:0]
  9. -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  10. -A INPUT -p icmp -j ACCEPT
  11. -A INPUT -i lo -j ACCEPT
  12. -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
  13. -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
  14. -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
  15. -A INPUT -j REJECT --reject-with icmp-host-prohibited
  16. -A FORWARD -j REJECT --reject-with icmp-host-prohibited
  17. COMMIT

重启防火墙服务:

  1. [root@localhost ~]# /etc/init.d/iptables restart

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

八、部署ASP.NET应用

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

  1. [root@localhost ~]# cd /usr/apollo/hostd/jexus/siteconf/
  2. [root@localhost siteconf]# cp default demo
  3. [root@localhost siteconf]# vi demo
  4.  

  5. port=8080
  6. root=/ /usr/apollo/webapps/demo
  7. hosts=* #OR your.com,*.your.com

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

  1. [root@localhost siteconf]# vi /etc/sysconfig/iptables
  2.  
  3. # Firewall configuration written by system-config-firewall
  4. # Manual customization of this file is not recommended.
  5. *filter
  6. :INPUT ACCEPT [0:0]
  7. :FORWARD ACCEPT [0:0]
  8. :OUTPUT ACCEPT [0:0]
  9. -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  10. -A INPUT -p icmp -j ACCEPT
  11. -A INPUT -i lo -j ACCEPT
  12. -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
  13. -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
  14. -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
  15. -A INPUT -j REJECT --reject-with icmp-host-prohibited
  16. -A FORWARD -j REJECT --reject-with icmp-host-prohibited
  17. COMMIT

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

  1. [root@localhost siteconf]# /etc/init.d/iptables restart

重启Jexus服务:

  1. [root@localhost siteconf]# /usr/apollo/hostd/jexus/jws restart

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

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

产品化

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

一、初始化脚本

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

  1. #!/bin/sh
  2.  
  3. #echo off
  4. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
  5.  
  6. #创建软链接,以支持将应用部署到任意目录
  7. #ln -s -T $DIR /usr/apollo
  8.  
  9. #拷贝事先配置好的MySQL配置文件到指定目录
  10. cp -f $DIR/conf/my.cnf /etc/my.cnf
  11.  
  12. #创建MySQL需要的用户和用户组
  13. groupadd mysql
  14. useradd -g mysql mysql
  15. chown -R root .
  16. chown -R mysql data
  17. chgrp -R mysql data
  18.  
  19. #设置MySQL服务开机自启动
  20. cp $DIR/data/support-files/mysql.server /etc/rc.d/init.d/mysqld
  21. chmod 700 /etc/init.d/mysqld
  22. chkconfig --add mysqld
  23. chkconfig --level 345 mysqld on
  24.  
  25. #将MySQL命令加入系统环境变量
  26. sudo cat $DIR/conf/profile >> /etc/profile
  27. source /etc/profile
  28.  
  29. #设置防火墙策略
  30. cp -f $DIR/conf/iptables /etc/sysconfig/iptables
  31.  
  32. #设置Jexus服务开机自启动
  33. sudo cat $DIR/conf/rc.local >> /etc/rc.d/rc.local
  34. chmod +x /etc/rc.d/rc.local
  35. chmod a+x $DIR/hostd/jexus/jws
  36. chmod a+x -R $DIR/hostd/mono/bin
  37.  
  38. #重启系统
  39. reboot

二、制作安装包

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

  1. [root@localhost ~]# tar jcvf crossplatform-1.0.0.0-centos6.4-x86_32_64.tar.bz2 /usr/apollo

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

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

  1. [root@localhost usr]# tar jxvf crossplatform-1.0.0.0-centos6.4-x86_32_64.tar.bz2

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

  1. [root@localhost usr]# cd apollo
  2. [root@localhost apollo]# sh ./install

在终端通过浏览器访问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中增加“<httpRuntime requestValidationMode="2.0"/>”全局配置;
  3. Mono似乎暂时不支持BundleConfig,所以不要用这种方式来绑定前台资源;
  4. 如果你用了Sping.NET IoC技术,你一定会爱上她针对ASP.NET MVC Controller的自动注入功能,但是目前在Mono上运行有问题,原因暂未查明,只能舍弃而改用传统的IObjectFactory.GetObject方法。
作者:张博

ASP.NET跨平台的更多相关文章

  1. ASP.NET跨平台最佳实践

    前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java ...

  2. Asp.Net跨平台:Ubuntu14.0+Mono+Jexus+Asp.Net

    Asp.Net跨平台的文章园子里有很多,这里给自己搭建的情况做一下总结,方便以后查看. 参考网站:   http://www.linuxdot.net/(Linux DotNET大本营 )  http ...

  3. 为支持ASP.NET5跨平台,Jexus再添新举措

    Jexus作为一款运行于Linux/FreeBSD平台上,以支持ASP.NET著称的高性能HTTP服务器和反向代理服务器,继5.6版完成对OWIN标准应用的支持后,就把着力点放到了对ASP.NET5的 ...

  4. Jexus 网站服务器和 ASP.NET 跨平台开发

    微软的跨平台战略 微软在过去的一年多中时间中发生了令整个 IT 行业感到惊叹的变化.这一切始于 Ballmer 的退位和 Nadella 的决心,更始于早已在微软各个基层部门蠢蠢欲动的二次创业. 以开 ...

  5. ASP.NET跨平台实践:无需安装Mono的Jexus“独立版”

    在Linux上运行ASP.NET网站或WebApi的传统步骤是,先安装libgdiplus,再安装mono,然后安装Jexus.在这个过程中,虽然安装Jexus是挺简便的一件事,但是安装mono就相对 ...

  6. Asp.Net跨平台 Jexus 5.8.1 独立版

    在Linux上运行ASP.NET网站或WebApi的传统步骤是,先安装libgdiplus,再安装mono,然后安装Jexus.在这个过程中,虽然安装Jexus是挺简便的一件事,但是安装mono就相对 ...

  7. ASP.NET跨平台、分布式技术架构技术栈概览 (迄今为止最全的.NET技术栈)

    今天有个学技术的小兄弟问我,现在这么多的技术我要学哪个?我说你根据岗位来学,学好了哪一门都可以在社会上立足,如今已经早已不是我们当年学习IT时候那么单纯了,给他讲了很多,发现现在的技术栈变得层次复杂且 ...

  8. 【原生态跨平台:ASP.NET Core 1.0(非Mono)在 Ubuntu 14.04 服务器上一对一的配置实现-篇幅1】

    鸡冻人心的2016,微软高产年. build 2016后 各种干货层出不穷. 1 Win10 集成了bash  ,实现了纳德拉的成诺,Microsoft Love Linux!!! 2 跨平台  ,收 ...

  9. 结合Jexus + Kestrel 部署 asp.net core 生产环境

    ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依赖. 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: ...

随机推荐

  1. 获取不同机型外置SD卡路径

    /** * 运行挂载命令.返回挂载的地址.然后将地址解析 */ private void getExtSDCardPath() { try { Runtime runtime = Runtime.ge ...

  2. TNS-12541: TNS:no listener TNS-12560: TNS:protocol adapter error TNS-00511: No listener Linux Error:

    今天是2014-06-17.遇到一个很奇怪的问题,可能之前測试改动监听的原因,导致监听启动后自己主动关闭,特此记录一下整个处理过程, 监听配置文件信息例如以下: [oracle@dg1 admin]$ ...

  3. Windows Phone开发(44):推送通知第二集——磁贴通知

    原文:Windows Phone开发(44):推送通知第二集--磁贴通知 前面我们说了第一个类型--Toast通知,这玩意儿不知大家是不是觉得很新鲜,以前玩.NET编程应该没接触过吧? 其实这东西绝对 ...

  4. DSL简介(转)

    DSL编程:有人将DSL编程称之为声明式(Declarative)编程.DSL是在模型之上建立的一种更加灵活的对 模型化的理解和使用方式.语义模型是DSL的核心.内部DSL:用通用语言的语法表示DSL ...

  5. POJ 1002 487-3279 Trie解读

    这个问题的解决方法是多种多样的.如本文所用,Trie为了解决这个问题. 它也可用于hash表.map等解决方案,由于输入是特定7数字,因此,你应该能够解决. 如本文所用,Trie不是非常快.最后,我主 ...

  6. 直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序

    一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2).空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; ...

  7. hdu3873 有约束条件的最短路

    题目大意:美国佬打算入侵火星,火星上有n个城市,有些城市可能受其他城市保护, 如果i城市受j城市保护,那么你必须先攻占j城市才能再攻占i城市,问你攻占城市n的最短时间是多少. 数据解释: 给定t, 表 ...

  8. 轻松管理您的网络password

    在互联网在现在这个时代,,我们注册了很多帐户.支付宝账号password,各种宝账户password.微信,QQ,电话password,购买各种网站,金融password,它是不是让孩子们的鞋子瞬间淡 ...

  9. C语言简单的菜单选项

    #include <stdio.h> char get_choice(void); char get_first(void); int get_int(void); void count( ...

  10. LeetCode204:Count Primes

    Description: Count the number of prime numbers less than a non-negative number, n. 比计算少n中素数的个数. 素数又称 ...