對于剛剛有意向和已經(jīng)行動將Asp.Net項(xiàng)目遷移到Linux服務(wù)器的小伙們,會碰到各種打擊,常說的一句就是,我的項(xiàng)目在IIS運(yùn)行的沒問題呀,但放到Linux怎么就不行了呢!這是為什么呢?大體上是因?yàn)椴糠謿v史原因的元素,大多數(shù)問題還是因?yàn)槲覀儧]有跨平臺的意識,在不經(jīng)意間在使用了Windows系統(tǒng)的特性(等下詳細(xì)說).
Asp.Net可以跨平臺不是個(gè)新鮮的事情,只是我們不了解而已,最早接觸Asp.Net跨平臺是在13年,那會將Asp.Net WebForm運(yùn)行在Linux還是有些麻煩,很多人都說玩玩就行了,你還指望上項(xiàng)目呀!那會還不知道Jexus是神馬,第一次嘗試的時(shí)候,Mono安裝是必備的,當(dāng)然全世界都知道的,其次就是安裝Apache(沒錯(cuò)),然后安裝Httpd,最后安裝xsp,麻煩吧!相對于現(xiàn)在是很麻煩了,最終還是很好的運(yùn)行了.
現(xiàn)在要想將Asp.Net在Linux運(yùn)行,大體上分兩種老項(xiàng)目用Jexus來運(yùn)行和新項(xiàng)目用Asp.Net Core開發(fā)用Kestrel Server運(yùn)行.
Jexus是國內(nèi)牛人宇內(nèi)流云所寫,使用CSharp基于Linux的epoll I/O復(fù)用,又針對Linux做了大量的優(yōu)化,Jexus性能比Xsp好很多,且使用簡單,操作方便,最貼心的是使用獨(dú)立版的話,Jexus已經(jīng)內(nèi)置Mono,真是做到了開箱即用.
Kestrel Server是微軟出品.在著名Libuv事件庫上,用CSharp進(jìn)行封裝,很好的繼承Libuv的特性,跨平臺,如果不知道Libuv,那么可能聽說過NodeJs,其實(shí)NodeJs底層也是Libuv.所以Kestrel Server在性能上是完全沒問題.但只能運(yùn)行Asp.Net Core項(xiàng)目.
TinyFox也是宇內(nèi)流云所寫,同樣也是基于Libuv,但宇大重新封裝了線程池,TinyFox主要運(yùn)行基于Owin協(xié)議的項(xiàng)目(Jexus也支持基于Owin項(xiàng)目),如果你不知道的話,那要好好的百度一下,這里面有很多的事情.同時(shí)也是可以支持傳統(tǒng)的Web項(xiàng)目(Asp.Net WebForm/MVC),是以適配器組件將Http請求信息(Owin的請求)轉(zhuǎn)換為Asp.Net WebForm的請求信息進(jìn)行運(yùn)行.還有一個(gè)很大的優(yōu)點(diǎn)是支持Socket,方便客戶端進(jìn)行通信.
不掰扯了,想要跨平臺,都要摒棄使用系統(tǒng)獨(dú)有的特性.假如說你使用Windows的特性,即使是Java項(xiàng)目中也不能好好的部署到Linux服務(wù)器.
Jexus開箱即用,使用也很簡單,這里就不多說如何使用了,具體參考Jexus的readme文件,有中文介紹.
不依賴Windows特性在項(xiàng)目引用的程序集,沒有使用Windows系統(tǒng)獨(dú)有的系統(tǒng)函數(shù)調(diào)用,如調(diào)用的kernel32.dll中系統(tǒng)函數(shù).
進(jìn)入正題,新建一個(gè)WebForm項(xiàng)目,當(dāng)然MVC項(xiàng)目也可以的.該項(xiàng)目是使用VS2017所建,當(dāng)然VS2015應(yīng)該相差不大.使用VS WebForm模板,看看項(xiàng)目中的文件.
asp.net webform項(xiàng)目 VS默認(rèn)模板
如果看項(xiàng)目引用,簡直是頭皮發(fā)麻呀!我就想建一個(gè)項(xiàng)目,至于那么多引用嗎?微軟真是太貼心了,以至于這些成為我們項(xiàng)目跨平臺的罪魁禍?zhǔn)?
將項(xiàng)目編譯后,將生成的文件放到Linux(這里使用Jexus運(yùn)行)先看看FileNotFoundExceptionasp.net. webform/mvc 發(fā)布到Linux遇到FileNotFoundException信息
Mono 5.0開始支持csc編譯了,還沒有運(yùn)行在Mono 5.0測試過的,碰到這個(gè)問題,就在NuGet管理器中卸載Microsoft.CodeDom.Providers.DotNetCompilerPlatform和Microsoft.Net.Compilers.
來看看卸載前后的對比:
VS的WebForm模板有些引用造成無法在Linux運(yùn)行的主要原因
說說模板中引用Microsoft.Web.Infrastructure.dll在VS中發(fā)布的Microsoft.Web.Infrastructure.dll文件是不能跨平臺的,是因?yàn)樵搸煳募褂肳indows的特性注冊表,在KillBitHelper類中.所以在發(fā)布之后,要先把該文件刪除掉,沒事的,因?yàn)镸ono很貼心給我們準(zhǔn)備一個(gè)跨平臺的Microsoft.Web.Infrastructure.dll.
Microsoft.Web.Infrastructure.dll這個(gè)模板引用的是無法在Linux運(yùn)行的
Mono下有同名對應(yīng)的動態(tài)庫的,在將該程序集排除后,將剩下的程序集拷貝到Linux上就可以了.
WebForm項(xiàng)目中文件名問題Linux系統(tǒng)對文件名大小寫是區(qū)分的,如index.html和Index.html這兩個(gè)文件名在Linux系統(tǒng)中是兩個(gè)文件,這一點(diǎn)和Windows是完全不一樣的.不管遷移老項(xiàng)目和新項(xiàng)目,最后對文件名進(jìn)行統(tǒng)一,個(gè)人建議文件名統(tǒng)一小寫處理.
早期Mono有一個(gè)配置MONO_IOMAP是可以在Linux不區(qū)分文件名大小寫的,這是需要以性能為代價(jià)實(shí)現(xiàn),是通過多次打開文件來實(shí)現(xiàn)的.
在Jexus配置也有MONO_IOMAP,隨著Mono移除該配置,Jexus也不支持區(qū)分文件名大小寫.
最后追加文章主要內(nèi)容是在2017年7月7日所寫,那時(shí)Kestrel Server和TingyFox都是基于Libuv,現(xiàn)在Kestrel Server都不支持Libuv了,TinyFox是基于對應(yīng)系統(tǒng)的Socket和IO復(fù)用(Windows IOCP/Linux Epoll)
項(xiàng)目需要遷移到Linux,又特別需要高性能的話,可以將在需要性能的地方,拆分為基于Owin的項(xiàng)目,
掃描二維碼推送至手機(jī)訪問。
版權(quán)聲明:本文由信途科技轉(zhuǎn)載于網(wǎng)絡(luò),如有侵權(quán)聯(lián)系站長刪除。
轉(zhuǎn)載請注明出處http://macbookprostickers.com/xintu/16132.html