Asp .Net core 2 學習筆記(3) —— 靜態文件

這個系列的初衷是便於本身總結與回顧,把筆記本上面的東西轉移到這裏,態度不禁得謹慎許多,下面是我參考的資源:css

 ASP.NET Core 中文文檔目錄html

官方文檔緩存

記在這裏的東西我會不斷的完善豐滿,對於文章裏面一些侷限於我本身知識積累的觀點,但願沒有跳走堅持看完的朋友,可以予以指正和鼓勵.安全

 

系列目錄

(1)Starup服務器

(2)中間件網絡

(3)靜態文件mvc

 

 

 

靜態文件

在上節中間件一節咱們提到:靜態文件中間件能夠處理對靜態文件的請求,並讓管道的其他部分短路,從而起到終端中間件的做用app

這一節咱們對靜態文件作一個更深刻的瞭解. 以一個新建的.Net core Web項目(有視圖模型控制器的模版)爲例ide

 

提供靜態文件

應用的Web主機必須識別內容根目錄。測試

項目Program.cs內容以下, 採用WebHost.CreateDefaultBuilder方法可將內容根目錄設置爲當前目錄:

 1     public class Program  2  {  3         public static void Main(string[] args)  4  {  5  CreateWebHostBuilder(args).Build().Run();  6  }  7 
 8         public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
 9  WebHost.CreateDefaultBuilder(args) 10                 .UseStartup<Startup>(); 11     }

 

提供 Web 根目錄內的文件

靜態文件存儲在項目的Web根目錄中。 默認目錄是 <content_root>/wwwroot,因此在項目wwwroot下面咱們看到了以下結構

 可是僅僅將內容根目錄設置爲當前目錄還不行,咱們還得在Starup啓動類的Configure方法下添加靜態文件中間件組件才行,

無參數的UseStaticFiles方法重載將Web根目錄中的文件標記爲可用
1     public void Configure(IApplicationBuilder app) 2  { 3 app.UseStaticFiles();
4 }

這樣wwwroot目錄下的組員文件才能被訪問,例如引用css文件

<link rel="stylesheet" href="~/css/site.css" />

 假設咱們把上述的UseStaticFiles方法註釋掉,咱們啓動項目後就會發現頁面的樣式徹底發生變化,那是由於在wwwroot裏面的樣式文件被禁止訪問了

 

更改默認目錄

上面說到靜態文件默認的目錄是 <content_root>/wwwroot,若是想換成別的命名,例如:<content_root>/staticroot,該如何操做呢?

咱們能夠經過WebHost.CreateDefaultBuilder方法,使用UseWebRoot更改默認目錄,代碼以下
 
 1     public class Program  2  {  3         public static void Main(string[] args)  4  {  5  CreateWebHostBuilder(args).Build().Run();  6  }  7 
 8         public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
 9  WebHost.CreateDefaultBuilder(args) 10                 //當前目錄下的staticroot文件夾
11                 .UseWebRoot(Path.Combine(Directory.GetCurrentDirectory(), "staticroot")) 12                 .UseStartup<Startup>(); 13     }

 這樣這樣靜態文件的默認目錄由 <content_root>/wwwroot變爲<content_root>/staticroot,若是不將項目的靜態資源轉移到<content_root>/staticroot下,那麼項目中的靜態資源將沒法被訪問

 

提供 Web 根目錄外的文件

若是咱們使用默認設置,那麼靜態文件的訪問都是跳到了wwwroot下,這個時候問題就出現了,,假設有以下的目錄結構

 

 

怎麼設置可以使得同級目錄也可以被訪問,好比既可以訪問<content_root>/wwwroot/img/header.jpg,又可以訪問<content_root>/MyStaticFiles/images/header.jpg

這時候就須要有參數的UseStaticFiles方法,經過StaticFileOptions對象來解決

 1       public void Configure(IApplicationBuilder app)  2  {  3             // For the wwwroot folder
 4  app.UseStaticFiles();  5             // For the /MyStaticFiles url
 6             app.UseStaticFiles(new StaticFileOptions  7  {  8                 FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")),  9                 RequestPath = "/MyStaticFiles"
10  }); 11         }

這樣設置,2個同級目錄就均可以訪問了

 

設置 HTTP 響應標頭

在靜態文件中間件組件中,上述的StaticFileOptions 對象還可用於設置 HTTP 響應標頭。

舉例而言,如下代碼除了配置從 Web 根目錄提供靜態文件外,還設置 Cache-Control 標頭:

 1         public void Configure(IApplicationBuilder app, IHostingEnvironment env)  2  {  3             var cachePeriod = env.IsDevelopment() ? "600" : "604800";  4             app.UseStaticFiles(new StaticFileOptions  5  {  6                 OnPrepareResponse = ctx =>
 7  {  8                     // Requires the following import:  9                     // using Microsoft.AspNetCore.Http;
10                     ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cachePeriod}"); 11  } 12  }); 13         }
效果:在開發環境中可公開緩存這些文件 10 分鐘(600 秒):

 

 

靜態文件受權

靜態文件模塊並不提供受權檢查。在上面設置wwwroot能夠訪問後,  wwwroot 下的全部文件都是公開的

因此爲了給文件提供受權,你須要有以下的操做:

    1將文件保存在 wwwroot 和靜態文件中間件能夠訪問到的任何目錄以外
    2經過一個控制器的 Action 來訪問它們,經過受權後返回 FileResult

1  [Authorize] 2         public IActionResult BannerImage() 3  { 4             var file = Path.Combine(Directory.GetCurrentDirectory(), 5             "MyStaticFiles", "images", "header.jpg"); 6              return PhysicalFile(file, "image/jpg+xml"); 7         }

這樣,只有經過了身份認證纔可以獲得文件信息

 

啓用目錄瀏覽

目錄瀏覽容許網站用戶看到指定目錄下的目錄和文件列表。

可是基於安全考慮,默認狀況下是禁用目錄訪問功能的。

在 Startup.Configure 中調用 UseDirectoryBrowser 擴展方法能夠開啓網絡應用目錄瀏覽:

1         public void Configure(IApplicationBuilder app, IHostingEnvironment env) 2  { 3             app.UseDirectoryBrowser(new DirectoryBrowserOptions 4  { 5                 FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")), 6                 RequestPath = "/Browser"
7  }); 8         }

訪問 <content_root>/Browser後效果以下

官方文檔說明:還須要調用 Startup.ConfigureServices 中的AddDirectoryBrowser 方法,以下

1         public void ConfigureServices(IServiceCollection services) 2  { 3  services.AddDirectoryBrowser(); 4         }

可是我測試的時候沒有註冊這個服務,仍然能夠啓用目錄,你們在用到或者測試的時候可用留意一下

 

默認文檔服務

設置默認首頁能給你的站點的每一個訪問者提供一個起始頁。使站點能提供默認頁,避免用戶輸入完整 URI.

輸入如下代碼

1         public void Configure(IApplicationBuilder app) 2  { 3  app.UseDefaultFiles(); 4  app.UseStaticFiles(); 5            }
 
Warnning
要提供默認文件,必須在 UseStaticFiles 前調用 UseDefaultFiles 。 UseDefaultFiles 實際上用於重寫 URL,不提
供文件。 經過 UseStaticFiles 啓用靜態文件中間件來提供文件。
 

項目啓動後,會在指定的目錄(未設置則在wwwroot下)按以下順序搜索文件,來做爲網站的起始頁

    default.htm
    default.html
    index.htm
    index.html
 

對於所用示例mvc項目來講,項目啓動後,由於路由的原故,路徑自動跳轉到/home/index下,若是設置了提供默認文檔,那麼會按照下面的狀況(通常而言靜態文件中間件會放在前面,具體狀況仍是以中間件添加順序爲準)

路徑 實際訪問
http://localhost:xxx wwwroot下default.html
http://localhost:xxx/home home控制器index方法
http://localhost:xxx/home/Idex home控制器index方法

 

 

 

 

 

 

 
 
起始頁默認是按上述的4個htm頁面順序來查找的,咱們也能夠更改成查找特定路徑,代碼以下
1         public void Configure(IApplicationBuilder app) 2  { 3             // Serve my app-specific default file, if present.
4             DefaultFilesOptions options = new DefaultFilesOptions(); 5  options.DefaultFileNames.Clear(); 6             options.DefaultFileNames.Add("index.html"); 7  app.UseDefaultFiles(options); 8  app.UseStaticFiles(); 9         }

這樣就變成了直接查找index.html,可是若是未找到index.html,那麼會直接404找不到頁面,而不會存在原來的查找順序

 

UseFileServer

UseFileServer 結合了上述UseStaticFiles 、 UseDefaultFiles 和 UseDirectoryBrowser 的功能。 
如下代碼啓用靜態文件、默認文件和及 MyStaticFiles 的目錄瀏覽: 
 
1         public void Configure(IApplicationBuilder app) 2  { 3             app.UseFileServer(new FileServerOptions 4  { 5                 FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")), 6                 RequestPath = "/MyStaticFIles", 7                 EnableDirectoryBrowsing = true
8  }); 9         }

訪問<content_root>/MyStaticFIles/會有下面2種狀況:

1/MyStaticFIles文件夾下沒有default.htm,default.html,index.htm,index.html

2/MyStaticFIles文件夾下存在default.htm,default.html,index.htm,index.html一個或多個做爲默認文檔

 

非標準的內容類型

ASP.NET 靜態文件中間件可以支持超過 400 種已知文件內容類型。

若是用戶請求一個未知的文件類型,靜態文件中間件將返回 HTTP 404(未找到)響應。

若是啓用目錄瀏覽,該文件的連接將會被顯示,但 URI 會返回一個 HTTP 404 錯誤。

1         public void Configure(IApplicationBuilder app) 2  { 3             app.UseStaticFiles(new StaticFileOptions 4  { 5                 ServeUnknownFileTypes = true, 6                 DefaultContentType = "image/png"
7  }); 8         }

根據上面的代碼,未知內容類型的文件請求將返回一張圖片,而不會返回一個未找到的錯誤。

 

Warnning

  • 代碼文件(包括 C# 和 Razor)應該放在應用程序項目的 wwwroo(默認爲wwwroot)以外的地方。這將確保您建立的應用程序能明確隔離客戶端側和服務器側源代碼,此舉能防止服務器側的代碼被泄露。同時,不要在生產環境開啓目錄瀏覽

 (終)

 

文檔信息

 


感謝您的閱讀,若是您以爲閱讀本文對您有幫助,請點一下「推薦」按鈕。本文歡迎各位轉載,可是轉載文章以後必須在文章頁面中給出做者和原文鏈接
相關文章
相關標籤/搜索