Asp.Net WebForm/MVC在Linux的运行的注意事项
起因
对于刚刚有意向和已经行动将Asp.Net项目迁移到Linux服务器的小伙们,会碰到各种打击,常说的一句就是,我的项目在IIS运行的没问题呀,但放到Linux怎么就不行了呢!这是为什么呢?大体上是因为部分历史原因的元素,大多数问题还是因为我们没有跨平台的意识,在不经意间在使用了Windows系统的特性(等下详细说).Asp.Net可以跨平台不是个新鲜的事情,只是我们不了解而已,最早接触Asp.Net跨平台是在13年,那会将Asp.Net WebForm运行在Linux还是有些麻烦,很多人都说玩玩就行了,你还指望上项目呀!那会还不知道Jexus是神马,第一次尝试的时候,Mono安装是必备的,当然全世界都知道的,其次就是安装Apache(没错),然后安装Httpd,最后安装xsp,麻烦吧!相对于现在是很麻烦了,最终还是很好的运行了.
现在要想将Asp.Net在Linux运行,大体上分两种老项目用Jexus来运行和新项目用Asp.Net Core开发用Kestrel Server运行.
Jexus是国内牛人宇内流云所写,使用CSharp基于Linux的epoll I/O复用,又针对Linux做了大量的优化,Jexus性能比Xsp好很多,且使用简单,操作方便,最贴心的是使用独立版的话,Jexus已经内置Mono,真是做到了开箱即用.
Kestrel Server是微软出品.在著名Libuv事件库上,用CSharp进行封装,很好的继承Libuv的特性,跨平台,如果不知道Libuv,那么可能听说过NodeJs,其实NodeJs底层也是Libuv.所以Kestrel Server在性能上是完全没问题.但只能运行Asp.Net Core项目.
TinyFox也是宇内流云所写,同样也是基于Libuv,但宇大重新封装了线程池,TinyFox主要运行基于Owin协议的项目,如果你不知道的话,那要好好的百度一下,这里面有很多的事情.同时也是可以支持传统的Web项目(Asp.Net WebForm/MVC),是以适配器组件将Http请求信息(Owin的请求)转换为Asp.Net WebForm的请求信息进行运行.还有一个很大的优点是支持Socket,方便客户端进行通信.
不掰扯了,想要跨平台,都要摒弃使用系统独有的特性.假如说你使用Windows的特性,即使是Java项目中也不能好好的部署到Linux服务器.
进入正题,新建一个WebForm项目,当然MVC项目也可以的.
该项目是使用VS2017所建,当然VS2015应该相差不大.使用VS WebForm模板,看看项目中的文件.如果看项目引用,简直是头皮发麻呀!我就想建一个项目,至于那么多引用吗?微软真是太贴心了,以至于这些成为我们项目跨平台的罪魁祸首.
先说说常见的FileNotFoundException
Mono 5.0开始支持csc编译了,还没有运行在Mono 5.0测试过的,以前的套路是这样的话,在NuGet管理器中卸载Microsoft.CodeDom.Providers.DotNetCompilerPlatform和Microsoft.Net.Compilers.
来看看卸载前后的对比:
说说Microsoft.Web.Infrastructure.dll
在VS中发布的Microsoft.Web.Infrastructure.dll文件是不能跨平台的,是因为该库文件使用Windows的特性注册表,在KillBitHelper类中.所以在发布之后,要先把该文件删除掉,没事的,因为Mono很贴心给我们准备一个跨平台的Microsoft.Web.Infrastructure.dll.在Windows查看Mono程序集列表命令: gacutil -l
在Linux上查看Mono程序集也是同样的命令:
结语
对于跨平台,我们要敢于尝试,总有路要趟,总有河要过,对于使用Mono是可以放心的,最典型的就是unity3d(跨平台就是用的Mono),王者荣耀就是unity 3d开发的.
秋风
2017-07-07