當咱們建立Core項目的時候,Web根目錄下會有個wwwroot文件目錄,wwwroot文件目錄裏面默認有HTML、CSS、IMG、JavaScript等文件,而這些文件都是Core提供給客戶端使用的靜態文件。可是這些靜態文件須要在Core裏面配置才能夠對外公開訪問。html
靜態文件都存儲在Core Web根目錄中。默認目錄是<content_root>/wwwroot,但可經過 UseWebRoot方法更改訪問目錄。而content_root是指web項目的全部文件夾,包括bin和wwwroot文件夾。web
若是咱們須要更改默認目錄,該如何更改呢?讓咱們來看看以下示例,如今有wwwroot默認目錄和新建MyStaticFiles目錄:瀏覽器
而後配置以下代碼:緩存
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseWebRoot(Directory.GetCurrentDirectory() + @"\MyStaticFiles\");//更改默認目錄(wwwroot)路徑方法,若是不須要更改,則註釋這段代碼。 } //須要在Startup.Configure配置靜態文件中間件。默認已配置,因此通常不用手動添加。 public class Startup { public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); } }
在Web主機在構建站點的時候,咱們經過UseWebRoot方法把默認訪問靜態文件路徑<content_root>/wwwroot更改成新建的<content_root>/MyStaticFiles文件路徑,再經過Startup.Configure方法配置靜態文件中間件讓其公開能夠訪問。經過項目運行,咱們能夠在瀏覽器地址欄上看到以下表格響應結果:安全
根目錄app |
URL上圖片連接ide |
更改默認目錄前是否能打開圖片連接svg |
更改默認目錄後是否能打開圖片連接工具 |
<content_root>/wwwroot測試 |
https://localhost:5001/images/1.jpg |
能 |
不能 |
<content_root>/MyStaticFiles |
https://localhost:5001/images/2.jpg |
不能 |
能 |
由上面表格結果,咱們能夠看到,未更改靜態文件默認訪問目錄前,<content_root>/wwwroot目錄下的靜態文件(HTML、CSS、IMG、JavaScript等)是能夠訪問的,而<content_root>/MyStaticFiles下的靜態文件是不可訪問的。可是更改成<content_root>/MyStaticFiles目錄訪問路徑後,<content_root>/wwwroot目錄下的靜態文件就訪問不到了。下面咱們在來看看如何配置訪問Web根目錄外的文件。
有時可能由於業務需求緣由,爲了區分默認靜態文件,咱們想要在Web根目錄下新建一個靜態文件夾處理業務。該如何配置呢?如今咱們來了解下。
在2.1節點示例演示的時候,新建了一個MyStaticFiles目錄,如今就拿這個目錄來演示,請按以下方式配置靜態文件中間件:
public void Configure(IApplicationBuilder app) { //設置默認靜態文件 app.UseStaticFiles(); //設置自定義靜態文件 app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")), RequestPath = "/StaticFiles" //重寫了一個虛擬路徑。 }); }
由上述代碼可知,MyStaticFiles目錄經過StaticFiles URI段公開。請求 http://<server_address>/StaticFiles/images/2.jpg提供 2.jpg 文件。也就是說在設置自定義靜態文件中間件同時並不影響設置默認靜態文件中間件。
Core提供了StaticFileOptions對象可用於設置HTTP響應標頭。除配置從Web根目錄提供靜態文件外,如下代碼還設置Cache-Control標頭,例如設置靜態文件緩存時間:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { var cachePeriod = env.IsDevelopment() ? "600" : "604800"; app.UseStaticFiles(new StaticFileOptions { OnPrepareResponse = ctx => { // Requires the following import: // using Microsoft.AspNetCore.Http; ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cachePeriod}");//(秒) } }); }
代碼中{cachePeriod}是設置瀏覽器緩存時間,這裏咱們設置爲10分鐘(600秒)緩存時間:
經過瀏覽器輔助工具能夠看到Response Headers設置了緩存時間。
在之間第四章節,咱們提到過,靜態文件中間件通常在身份驗證/受權中間件以前設置,因此靜態文件不須要驗證,可是好比咱們須要Controller控制器受權提供文件信息,該如何設置?請看以下代碼:
[Authorize] public IActionResult BannerImage() { var file = Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles", "images", "banner1.svg"); return PhysicalFile(file, "image/svg+xml"); }
返回結果:
經過目錄瀏覽,Web應用的用戶可查看目錄列表和指定目錄中的文件。出於安全考慮,目錄瀏覽默認處於禁用狀態,啓用目錄瀏覽是有風險的。調用Startup.Configure中的UseDirectoryBrowser方法來啓用目錄瀏覽:
public void Configure(IApplicationBuilder app) { //第一個調用提供wwwroot文件夾中的靜態文件。 app.UseStaticFiles(); //第二個調用使用URL http://<server_address>/MyImages瀏覽wwwroot/images文件夾的目錄。 app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")), RequestPath = "/MyImages" }); app.UseDirectoryBrowser(new DirectoryBrowserOptions { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")), RequestPath = "/MyImages" }); }
調用Startup.ConfigureServices中的AddDirectoryBrowser方法來添加所需服務:
public void ConfigureServices(IServiceCollection services) { services.AddDirectoryBrowser(); }
上述代碼容許使用URL http://<server_address>/MyImages瀏覽wwwroot/images文件夾的目錄,並連接到每一個文件和文件夾:
在Core設置默認主頁爲訪問者訪問網站時提供了起點,這種狀況跟IIS上設置站點默認文檔是同樣的。若要在用戶不徹底限定URI的狀況下提供默認頁面,請調用Startup.Configure中的UseDefaultFiles方法:
public void Configure(IApplicationBuilder app) { //要提供默認文件,必須在UseStaticFiles前調用UseDefaultFiles。UseDefaultFiles實際上 //用於重寫URL,不提供文件。經過UseStaticFiles啓用靜態文件中間件來提供文件。 app.UseDefaultFiles(); app.UseStaticFiles(); }
在wwwroot目錄下新增一個default.html頁面。這裏要注意一點是,添加默認文檔名稱同樣要跟IIS上默認文檔名稱(default.htm,default.html,index.htm,index.html)都一致,不然若是自定義名稱,會默認打開路由默認路徑地址。
6.1小節提到一個點,添加默認文檔都要跟IIS上默認名稱一致,可是若是咱們須要自定義默認文檔名稱呢?該如何設置?如下代碼將默認文件名更改成mydefault.html:
public void Configure(IApplicationBuilder app) { // Serve my app-specific default file, if present. DefaultFilesOptions options = new DefaultFilesOptions(); options.DefaultFileNames.Clear(); options.DefaultFileNames.Add("mydefault.html"); app.UseDefaultFiles(options); app.UseStaticFiles(); }
Core提供了UseFileServer對象,這個對象集成了UseStaticFiles、UseDefaultFiles和 UseDirectoryBrowser的功能。下面咱們經過代碼來看看如何使用。
提供靜態文件和默認文件。未啓用目錄瀏覽:
app.UseFileServer();
經過啓用目錄瀏覽基於無參數重載進行構建:
app.UseFileServer(enableDirectoryBrowsing: true);
啓用靜態文件、默認文件和及 MyStaticFiles 的目錄瀏覽示例代碼:
public void ConfigureServices(IServiceCollection services) { services.AddDirectoryBrowser(); } public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); // For the wwwroot folder app.UseFileServer(new FileServerOptions { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")), RequestPath = "/StaticFiles", EnableDirectoryBrowsing = true }); }
響應結果就不截圖多說了,寫那麼久也累了。由於2-6小節也有示例,你們就自行測試吧。
參考文獻:
ASP.NET Core 中的靜態文件