跟我一起学.NetCore之静态文件处理的那些事
前言
如今前后端分離開(kāi)發(fā)模式如火如荼,開(kāi)發(fā)職責(zé)更加分明(當(dāng)然前后端一起搞的模式也沒(méi)有完全褪去);而對(duì)于每個(gè)公司產(chǎn)品實(shí)施來(lái)說(shuō),部署模式會(huì)稍有差別,有的會(huì)單獨(dú)將前端文件部署為一個(gè)站點(diǎn),有的會(huì)將前端文件和后端站點(diǎn)整合一起部署;通常當(dāng)項(xiàng)目規(guī)模比較大的時(shí)候,分開(kāi)站點(diǎn)部署是不錯(cuò)的選擇,管理和維護(hù)清晰,而對(duì)于一些小型項(xiàng)目,整合在一起部署為一個(gè)站點(diǎn)就顯得相對(duì)比較方便,畢竟有時(shí)候開(kāi)發(fā)是你、部署是你、維護(hù)也是你;如果選擇整合部署,或者是項(xiàng)目包含靜態(tài)文件(如圖片)的訪問(wèn),接下來(lái)的內(nèi)容就有用武之地了~~~
正文
Asp.NetCore的請(qǐng)求管道是根據(jù)需求通過(guò)注冊(cè)中間件進(jìn)行構(gòu)造的(構(gòu)造過(guò)程參考:跟我一起學(xué).NetCore之中間件(Middleware)簡(jiǎn)介和解析請(qǐng)求管道構(gòu)建),而通過(guò)模板創(chuàng)建出來(lái)的項(xiàng)目,請(qǐng)求管道中默認(rèn)只有關(guān)鍵的幾個(gè)中間件,如果有其他需要,可以自己添加注冊(cè)。其中靜態(tài)文件中間件默認(rèn)就沒(méi)有,如下案例:
如上例運(yùn)行結(jié)果,是訪問(wèn)不到添加的index.html,可能有小伙伴會(huì)說(shuō),那是因?yàn)闆](méi)有加目錄,然而并不是這個(gè)原因;?現(xiàn)在注冊(cè)上靜態(tài)文件中間件試試:
為什么要?jiǎng)?chuàng)建wwwroot目錄呢?其他目錄不行嗎?
當(dāng)注冊(cè)靜態(tài)文件中間件時(shí),通過(guò)構(gòu)造函數(shù)可以看出(看下面靜態(tài)文件中間件的構(gòu)造函數(shù)截圖),可以指定對(duì)應(yīng)的靜態(tài)文件目錄,當(dāng)沒(méi)有指定目錄時(shí),默認(rèn)就會(huì)使用IHostingEnvironment中的WebRootFileProvider,而WebRootFileProvider默認(rèn)就指定了wwwroot:
在IHostingEnvironment的擴(kuò)展方法Initialize中指定;
這里就不一一去扒代碼了,如果有興趣的小伙伴,可以按照以下思路去扒:
那如何指定目錄,在扒代碼的過(guò)程中應(yīng)該會(huì)看到,注冊(cè)中間件的時(shí)候可以傳參進(jìn)行指定,如下:
根據(jù)需求可以注冊(cè)多個(gè)靜態(tài)文件中間件,如上所示,請(qǐng)求到請(qǐng)求管道時(shí),會(huì)先到wwwroot目錄中去找匹配文件,如果找不到繼續(xù)下一個(gè)中間件,去指定的myFile目錄中去匹配文件。
往往在開(kāi)發(fā)過(guò)程中,會(huì)對(duì)相關(guān)靜態(tài)文件進(jìn)行分類,同時(shí)Url地址也要不同,通常會(huì)通過(guò)注冊(cè)中間件時(shí),將對(duì)應(yīng)靜態(tài)文件目錄映射到指定Url目錄,如下:
搞過(guò)IIS的小伙伴應(yīng)該都知道設(shè)置默認(rèn)文件的配置吧,通過(guò)現(xiàn)成的中間件也能實(shí)現(xiàn),如下:
注冊(cè)中間件實(shí)現(xiàn),能減少配置當(dāng)然也是不錯(cuò)的選擇:
到這,小伙伴們應(yīng)該嘗試一下,將wwwroot目錄下的index.html的名字改改,再運(yùn)行一下,同樣的訪問(wèn)Url地址肯定訪問(wèn)不了的,如果能,那估計(jì)是存在緩存,可以清清緩存再試;?那為什么呢?定位很精確,肯定是默認(rèn)文件這個(gè)中間件再搞事情,來(lái),看看里面咋實(shí)現(xiàn)的:
在中間件Invoke方法中,遍歷_options.DefaultFileNames進(jìn)行匹配,但我們并沒(méi)有指定,猜想應(yīng)該是有默認(rèn)設(shè)置,去看看對(duì)應(yīng)的DefaultFilesOptions:
public DefaultFilesOptions(SharedOptions sharedOptions): base(sharedOptions) {// 果然,在構(gòu)造函數(shù)中指定了默認(rèn)列表DefaultFileNames = new List<string>{"default.htm","default.html","index.htm","index.html",}; }果然在DefaultFilesOptions的構(gòu)造函數(shù)有對(duì)應(yīng)的默認(rèn)列表,現(xiàn)在是不是豁然開(kāi)朗了~~~;那如果一定要指定其他文件怎么辦呢?老規(guī)矩,注冊(cè)中間件時(shí)傳參:
是不是很簡(jiǎn)單,再來(lái)個(gè)需求,比如想做一個(gè)在線文件管理系統(tǒng),那肯定得訪問(wèn)目錄吧,現(xiàn)在肯定不能訪問(wèn)的,小伙伴們可以試試;?
通過(guò)注冊(cè)中間又可以實(shí)現(xiàn),是不是覺(jué)得中間件很是靈活,而且還很強(qiáng)大:
這里對(duì)于參數(shù)的設(shè)置就不一一舉例了,用法和UseStaticFiles參數(shù)差不多一致,小伙伴感興趣可私下試試。
其實(shí)微軟早就想到一會(huì)要這么干,一會(huì)要那么干了,所以直接提供了一個(gè)全功能的中間件,直接UseFileServer即可,可以針對(duì)上面說(shuō)到的每一項(xiàng)進(jìn)行配置,如下:
其實(shí)內(nèi)部就是整合以上說(shuō)到的中間件,如下源碼:
詳細(xì)配置這里就不一一配置測(cè)試了,使用和單獨(dú)注冊(cè)中間件時(shí)一致,這里只是整合在一起而已。
總結(jié)
說(shuō)好的偏應(yīng)用,還是沒(méi)忍住扒代碼,但是感覺(jué)適當(dāng)?shù)陌前悄苷f(shuō)的更清楚一些;下一節(jié)說(shuō)說(shuō)路由的最佳實(shí)踐。
總結(jié)
以上是生活随笔為你收集整理的跟我一起学.NetCore之静态文件处理的那些事的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《ASP.NET Core 真机拆解》
- 下一篇: ASP.NET Core Blazor