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