自行实现高性能MVC
wcf雖然功能多、擴(kuò)展性強(qiáng)但是也面臨配置忒多,而且restful的功能相當(dāng)怪異,并且目前沒(méi)法移植。asp.net core雖然支持webapi,但是功能也相對(duì)繁多、配置復(fù)雜。就沒(méi)有一個(gè)能讓碼農(nóng)們安安心心的寫webapi,無(wú)需考慮性能、配置、甚至根據(jù)問(wèn)題場(chǎng)景自行設(shè)計(jì)、改造等問(wèn)題的方案么?
當(dāng)然不是,特別是在dnc2.0已經(jīng)相當(dāng)強(qiáng)大的此時(shí),完全可以自行設(shè)計(jì)一套簡(jiǎn)潔、高效的webapi框架!說(shuō)到自行寫一套框架,很多碼農(nóng)們就可能會(huì)想到開發(fā)工作量難以想像,事實(shí)真的如此么?java因?yàn)殚_源眾多,很多對(duì)mvc稍有了解的都可以拿這個(gè)拿那個(gè)拼出一個(gè)自已的mvc框架;而面對(duì)日益強(qiáng)大的dnc,本人覺(jué)得C#根本無(wú)需東拼西湊這么麻煩,完全可以根據(jù)自已的需求簡(jiǎn)單快速的寫出一個(gè)來(lái),不服就開干!
設(shè)計(jì)的編碼思路就是仿asp.net mvc,原因就是asp.net mvc成功發(fā)展了這么多年,有著大量的C#碼農(nóng)習(xí)慣了這套優(yōu)良的編碼方式;至于spring mvc、spring boot那些,站在使用者的角度來(lái)說(shuō),光配置和注解都能敲死人,如要要說(shuō)簡(jiǎn)潔快速,asp.net mvc比他強(qiáng)多了,更別提ruby on rails。不扯遠(yuǎn)了,下面就按C#經(jīng)典來(lái)。那么需要考慮的問(wèn)題有tcp、http、request、response、server、controller、actionresult、routetable等,下面就一一來(lái)解決這個(gè)問(wèn)題。
一、Tcp:這個(gè)是實(shí)現(xiàn)傳輸通信的底層,當(dāng)然采用IOCP來(lái)提高吞吐量和性能,本人之前在做Redis Client等的時(shí)候就使用這個(gè)IOCP Socket的框架,此時(shí)正好也可以用上
二、Http:這個(gè)是個(gè)應(yīng)用協(xié)議,本人了解下來(lái)至少有3個(gè)版本,完全熟悉的話估計(jì)沒(méi)個(gè)半年都搞不定;但是只需要關(guān)鍵,比如說(shuō)http1.1的工作模式、傳輸格式、常見(jiàn)異常code、常見(jiàn)mime類型、js跨域支持等,這些基本能覆蓋絕大部分日常場(chǎng)景,至于更多的那些細(xì)枝末節(jié)的理它作甚,本人的做法就是用Chrome的開發(fā)人員工具來(lái)查看相關(guān)network詳情,這樣的話就可以清楚http這個(gè)協(xié)議的具體編碼解碼了。
經(jīng)過(guò)分析后http的內(nèi)容格式其實(shí)就是字符回車分隔,再加上一些約定生成的分隔符bound完成的。
看到上面,有人肯定會(huì)說(shuō)你這個(gè)傳文件咋辦?一個(gè)呢本人這個(gè)是針對(duì)webapi;另外一個(gè),如真有這個(gè)場(chǎng)景,可以用Chrome的開發(fā)人員工具來(lái)查看相關(guān)network詳情,也可以使用httpanalyzerstd、httpwatch等眾多工具分析下,其實(shí)也就是使用了一些約定的分隔符bound完成,每個(gè)瀏覽器還不一樣,有興趣的完全可以自行擴(kuò)展一個(gè)。
三、Reponse這個(gè)是webapi服務(wù)端相當(dāng)重要的一個(gè)組件,本人也是盡可能方便并且按盡量按asp.net mvc的命名來(lái)實(shí)現(xiàn),另外這里加入支持js跨域所需大部分場(chǎng)景heads,如果還有特殊的heads,完全可以自已添加。
四、HttpServer:這個(gè)就是承載webapi的容器;有人說(shuō)不是有IIS和Apache么?本人想說(shuō)的是:有self-host方便么?有無(wú)需安裝,無(wú)需配置、隨便高性能開跑好么?asp.net core里面都有了這個(gè),沒(méi)這個(gè)就沒(méi)有逼格....(此處省略一萬(wàn)字),前面還研究tcp、http這個(gè)當(dāng)然不能少了
? 五、Controller:為了實(shí)現(xiàn)類似于mvc的效果Controller這個(gè)大名鼎鼎的當(dāng)然不能少了,其在C#中使用非常少量的代碼即可實(shí)現(xiàn)
六、ActionResult:是mvc里面針對(duì)reponse結(jié)果進(jìn)行了一個(gè)http格式的封裝,本人主要實(shí)現(xiàn)了ContentResult、JsonResult、FileResult三個(gè),至于其他的在WebAPI里基本上用不到。
七、RouteTable:MVC里面有一個(gè)相當(dāng)重要的概念叫約定優(yōu)先,即為Controller、Action的名稱是按某種規(guī)則來(lái)寫編碼的,其中將URL與自定義Controller對(duì)應(yīng)起來(lái)的緩存映射就是RouteTable,并且作為緩存,也能極大的提升訪問(wèn)性能。當(dāng)然這里并沒(méi)有嚴(yán)格按照asp.net mvc里面的routetable來(lái)設(shè)計(jì),而是根據(jù)只是實(shí)現(xiàn)webapi,并使用緩存反射結(jié)構(gòu)能來(lái)實(shí)現(xiàn)的,并且只有約定,沒(méi)有配置。
在MVC的思想里面ActionFilterAtrribute的這個(gè)AOP設(shè)計(jì)也一直伴隨左右,比如記日志、黑名單、權(quán)限、驗(yàn)證、限流等等功能,所以路由的時(shí)候也會(huì)緩存這個(gè)。至此一些關(guān)鍵性的地方都已經(jīng)弄的差不多了,為了更好的了解上面說(shuō)的這些,下面是vs2017中項(xiàng)目的結(jié)構(gòu)截圖:
純粹干凈單碼,無(wú)任何晦澀內(nèi)容,如果對(duì)mvc有一定了解的,這個(gè)差不多可以NoNotes,接下來(lái)就是按asp.net mvc命名方式,寫個(gè)測(cè)試webapi看看情況,首先還是測(cè)試項(xiàng)目結(jié)構(gòu)圖:
HomeController里面按asp.net mvc的習(xí)慣來(lái)編寫代碼:
? ? ? ? ? ?
response.Write("<h3>測(cè)試一下那個(gè)response對(duì)象使用情況!</h3>參考消息網(wǎng)4月12日?qǐng)?bào)道外媒稱,法國(guó)一架“幻影-2000”戰(zhàn)機(jī)意外地對(duì)本國(guó)一家工廠投下了...");
program.cs Main中啟動(dòng)一下服務(wù):
mvcApplication.Start();
最后F5跑起來(lái)看看效果:
使用Apache ab.exe壓測(cè)一下性能如何:
至此,一個(gè)簡(jiǎn)潔、高效的WebApi就初步完成了!
轉(zhuǎn)載請(qǐng)標(biāo)明本文來(lái)源:http://www.cnblogs.com/yswenli/p/8858669.html
更多內(nèi)容歡迎star作者的github:https://github.com/yswenli/SAEA
原文鏈接:https://www.cnblogs.com/yswenli/p/8858669.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的自行实现高性能MVC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .NET手撸2048小游戏
- 下一篇: .NET Core 3.1 编写混合 C