ASP.NET?Core中的靜態(tài)文件
1.前言
當(dāng)我們創(chuàng)建Core項目的時候,Web根目錄下會有個wwwroot文件目錄,wwwroot文件目錄里面默認(rèn)有HTML、CSS、IMG、JavaScript等文件,而這些文件都是Core提供給客戶端使用的靜態(tài)文件。但是這些靜態(tài)文件需要在Core里面配置才可以對外公開訪問。
2.設(shè)置靜態(tài)文件目錄
靜態(tài)文件都存儲在Core Web根目錄中。默認(rèn)目錄是<content_root>/wwwroot,但可通過 UseWebRoot方法更改訪問目錄。而content_root是指web項目的所有文件夾,包括bin和wwwroot文件夾。
2.1 設(shè)置默認(rèn)靜態(tài)文件目錄
如果我們需要更改默認(rèn)目錄,該如何更改呢?讓我們來看看如下示例,現(xiàn)在有wwwroot默認(rèn)目錄和新建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\");//更改默認(rèn)目錄(wwwroot)路徑方法,如果不需要更改,則注釋這段代碼。 } //需要在Startup.Configure配置靜態(tài)文件中間件。默認(rèn)已配置,所以一般不用手動添加。 public class Startup { public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); } }
在Web主機在構(gòu)建站點的時候,我們通過UseWebRoot方法把默認(rèn)訪問靜態(tài)文件路徑<content_root>/wwwroot更改為新建的<content_root>/MyStaticFiles文件路徑,再通過Startup.Configure方法配置靜態(tài)文件中間件讓其公開可以訪問。通過項目運行,我們可以在瀏覽器地址欄上看到如下表格響應(yīng)結(jié)果:
根目錄 | URL上圖片鏈接 | 更改默認(rèn)目錄前是否能打開圖片鏈接 | 更改默認(rèn)目錄后是否能打開圖片鏈接 |
<content_root>/wwwroot | https://localhost:5001/images/1.jpg | 能 | 不能 |
<content_root>/MyStaticFiles | https://localhost:5001/images/2.jpg | 不能 | 能 |
由上面表格結(jié)果,我們可以看到,未更改靜態(tài)文件默認(rèn)訪問目錄前,<content_root>/wwwroot目錄下的靜態(tài)文件(HTML、CSS、IMG、JavaScript等)是可以訪問的,而<content_root>/MyStaticFiles下的靜態(tài)文件是不可訪問的。但是更改為<content_root>/MyStaticFiles目錄訪問路徑后,<content_root>/wwwroot目錄下的靜態(tài)文件就訪問不到了。下面我們在來看看如何配置訪問Web根目錄外的文件。
2.2 設(shè)置訪問Web根目錄外的文件
有時可能因為業(yè)務(wù)需求原因,為了區(qū)分默認(rèn)靜態(tài)文件,我們想要在Web根目錄下新建一個靜態(tài)文件夾處理業(yè)務(wù)。該如何配置呢?現(xiàn)在我們來了解下。
在2.1節(jié)點示例演示的時候,新建了一個MyStaticFiles目錄,現(xiàn)在就拿這個目錄來演示,請按如下方式配置靜態(tài)文件中間件:
public void Configure(IApplicationBuilder app) { //設(shè)置默認(rèn)靜態(tài)文件 app.UseStaticFiles(); //設(shè)置自定義靜態(tài)文件 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 文件。也就是說在設(shè)置自定義靜態(tài)文件中間件同時并不影響設(shè)置默認(rèn)靜態(tài)文件中間件。
3.設(shè)置HTTP響應(yīng)標(biāo)頭
Core提供了StaticFileOptions對象可用于設(shè)置HTTP響應(yīng)標(biāo)頭。除配置從Web根目錄提供靜態(tài)文件外,以下代碼還設(shè)置Cache-Control標(biāo)頭,例如設(shè)置靜態(tài)文件緩存時間:
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}是設(shè)置瀏覽器緩存時間,這里我們設(shè)置為10分鐘(600秒)緩存時間:
通過瀏覽器輔助工具可以看到Response Headers設(shè)置了緩存時間。
4.靜態(tài)文件授權(quán)
在之間第四章節(jié),我們提到過,靜態(tài)文件中間件一般在身份驗證/授權(quán)中間件之前設(shè)置,所以靜態(tài)文件不需要驗證,但是比如我們需要Controller控制器授權(quán)提供文件信息,該如何設(shè)置?請看如下代碼:
[Authorize] public IActionResult BannerImage() { var file = Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles", "images", "banner1.svg"); return PhysicalFile(file, "image/svg+xml"); }
返回結(jié)果:
5.啟用目錄瀏覽
通過目錄瀏覽,Web應(yīng)用的用戶可查看目錄列表和指定目錄中的文件。出于安全考慮,目錄瀏覽默認(rèn)處于禁用狀態(tài),啟用目錄瀏覽是有風(fēng)險的。調(diào)用Startup.Configure中的UseDirectoryBrowser方法來啟用目錄瀏覽:
public void Configure(IApplicationBuilder app) { //第一個調(diào)用提供wwwroot文件夾中的靜態(tài)文件。 app.UseStaticFiles(); //第二個調(diào)用使用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" }); }
調(diào)用Startup.ConfigureServices中的AddDirectoryBrowser方法來添加所需服務(wù):
public void ConfigureServices(IServiceCollection services) { services.AddDirectoryBrowser(); }
上述代碼允許使用URL http://<server_address>/MyImages瀏覽wwwroot/images文件夾的目錄,并鏈接到每個文件和文件夾:
6.設(shè)置靜態(tài)文件默認(rèn)文檔
6.1設(shè)置默認(rèn)文檔
在Core設(shè)置默認(rèn)主頁為訪問者訪問網(wǎng)站時提供了起點,這種情況跟IIS上設(shè)置站點默認(rèn)文檔是一樣的。若要在用戶不完全限定URI的情況下提供默認(rèn)頁面,請調(diào)用Startup.Configure中的UseDefaultFiles方法:
public void Configure(IApplicationBuilder app) { //要提供默認(rèn)文件,必須在UseStaticFiles前調(diào)用UseDefaultFiles。UseDefaultFiles實際上 //用于重寫URL,不提供文件。通過UseStaticFiles啟用靜態(tài)文件中間件來提供文件。 app.UseDefaultFiles(); app.UseStaticFiles(); }
在wwwroot目錄下新增一個default.html頁面。這里要注意一點是,添加默認(rèn)文檔名稱一樣要跟IIS上默認(rèn)文檔名稱(default.htm,default.html,index.htm,index.html)都一致,否則如果自定義名稱,會默認(rèn)打開路由默認(rèn)路徑地址。
6.2更改默認(rèn)文檔名稱
6.1小節(jié)提到一個點,添加默認(rèn)文檔都要跟IIS上默認(rèn)名稱一致,但是如果我們需要自定義默認(rèn)文檔名稱呢?該如何設(shè)置?以下代碼將默認(rèn)文件名更改為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(); }
7.UseFileServer
Core提供了UseFileServer對象,這個對象集成了UseStaticFiles、UseDefaultFiles和 UseDirectoryBrowser的功能。下面我們通過代碼來看看如何使用。
提供靜態(tài)文件和默認(rèn)文件。未啟用目錄瀏覽:
app.UseFileServer();
通過啟用目錄瀏覽基于無參數(shù)重載進行構(gòu)建:
app.UseFileServer(enableDirectoryBrowsing: true);
啟用靜態(tài)文件、默認(rèn)文件和及 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 }); }
參考文獻(xiàn):ASP.NET Core 中的靜態(tài)文件
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Asp.net 5中的ApplicationBuilder
這篇文章介紹了Asp.net 5中的ApplicationBuilder,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01ASP.NET2.0+SQL Server2005構(gòu)建多層應(yīng)用
ASP.NET2.0+SQL Server2005構(gòu)建多層應(yīng)用...2006-12-12一步步打造漂亮的新聞列表(無刷新分頁、內(nèi)容預(yù)覽)第三章
前面兩個章節(jié)我們將需求分析和概要設(shè)計簡單介紹了,接下來是重點的編代碼的階段了(實現(xiàn)無刷新分頁)。在編寫代碼之前,一定要有計劃的去編寫代碼,不能一開始啥也不管就開始編代碼,除非你特牛。2010-07-07