1. 程式人生 > >跟我一起學.NetCore之靜態檔案處理的那些事

跟我一起學.NetCore之靜態檔案處理的那些事

**前言** 如今前後端分離開發模式如火如荼,開發職責更加分明(當然前後端一起搞的模式也沒有完全褪去);而對於每個公司產品實施來說,部署模式會稍有差別,有的會單獨將前端檔案部署為一個站點,有的會將前端檔案和後端站點整合一起部署;通常當專案規模比較大的時候,分開站點部署是不錯的選擇,管理和維護清晰,而對於一些小型專案,整合在一起部署為一個站點就顯得相對比較方便,畢竟有時候開發是你、部署是你、維護也是你;如果選擇整合部署,或者是專案包含靜態檔案(如圖片)的訪問,接下來的內容就有用武之地了~~~ **正文** Asp.NetCore的請求管道是根據需求通過註冊中介軟體進行構造的(構造過程參考:[跟我一起學.NetCore之中介軟體(Middleware)簡介和解析請求管道構建](http://mp.weixin.qq.com/s?__biz=MzU1MzYwMjQ5MQ==&mid=2247483890&idx=1&sn=5df23da5dd78730b52d7eb4247038104&chksm=fbf11d26cc869430db30930b24fa6984892a6c50aec94da9a9793c62fd1e15b9da0626ead75a&scene=21#wechat_redirect)),而通過模板創建出來的專案,請求管道中預設只有關鍵的幾個中介軟體,如果有其他需要,可以自己添加註冊。其中靜態檔案中介軟體預設就沒有,如下案例: ![img](https://i.loli.net/2020/09/17/2b6V9DKxYLhM45N.png) 如上例執行結果,是訪問不到新增的index.html,可能有小夥伴會說,那是因為沒有加目錄,然而並不是這個原因; 現在註冊上靜態檔案中介軟體試試: ![img](https://i.loli.net/2020/09/17/6w4PHyneTxglzs1.png) 為什麼要建立wwwroot目錄呢?其他目錄不行嗎? 當註冊靜態檔案中介軟體時,通過建構函式可以看出(看下面靜態檔案中介軟體的建構函式截圖),可以指定對應的靜態檔案目錄,當沒有指定目錄時,預設就會使用IHostingEnvironment中的WebRootFileProvider,而WebRootFileProvider預設就指定了wwwroot: ![img](https://i.loli.net/2020/09/17/oN1EkTCIiG4u9ZK.png) 在IHostingEnvironment的擴充套件方法Initialize中指定; ![img](https://i.loli.net/2020/09/17/juKIZa51NTx8ywz.png) 這裡就不一一去扒程式碼了,如果有興趣的小夥伴,可以按照以下思路去扒: ![img](https://i.loli.net/2020/09/17/iEUVDs9t2uerlMa.png) 那如何指定目錄,在扒程式碼的過程中應該會看到,註冊中介軟體的時候可以傳參進行指定,如下: ![img](https://i.loli.net/2020/09/17/akshLvHxcMNm8iK.png) 根據需求可以註冊多個靜態檔案中介軟體,如上所示,請求到請求管道時,會先到wwwroot目錄中去找匹配檔案,如果找不到繼續下一個中介軟體,去指定的myFile目錄中去匹配檔案。 往往在開發過程中,會對相關靜態檔案進行分類,同時Url地址也要不同,通常會通過註冊中介軟體時,將對應靜態檔案目錄對映到指定Url目錄,如下: ![img](https://i.loli.net/2020/09/17/gNfiIPLcmuwaeHZ.png) 搞過IIS的小夥伴應該都知道設定預設檔案的配置吧,通過現成的中介軟體也能實現,如下: ![img](https://i.loli.net/2020/09/17/nVaIiOARS2Eywdo.png) 註冊中介軟體實現,能減少配置當然也是不錯的選擇: ![img](https://i.loli.net/2020/09/17/Dzip3SjNEBY1FsA.png) 到這,小夥伴們應該嘗試一下,將wwwroot目錄下的index.html的名字改改,再執行一下,同樣的訪問Url地址肯定訪問不了的,如果能,那估計是存在快取,可以清清快取再試; 那為什麼呢?定位很精確,肯定是預設檔案這個中介軟體再搞事情,來,看看裡面咋實現的: ```c# // 定義預設檔案中介軟體 public class DefaultFilesMiddleware { // 選項配置 private readonly DefaultFilesOptions _options; private readonly PathString _matchUrl; private readonly RequestDelegate _next; // 靜態檔案目錄讀取Provider,預設目錄是wwwroot private readonly IFileProvider _fileProvider; // 建構函式,用於初始化對應的變數 public DefaultFilesMiddleware(RequestDelegate next, IWebHostEnvironment hostingEnv,