這篇講解asp.net core中的靜態文件(大體翻譯於官網)。css
靜態文件,例如HTML,CSS, images和JavaScript. 要想直接被客戶端訪問,須要作一些配置。html
靜態文件存儲在項目的web root 目錄下。默認的目錄是<content_root>/wwwroot,但能夠經過UseWebRoot方法來改變默認目錄。web
更多能夠查看: See Content root and Web root for more information.緩存
應用的web host 必須知道內容根目錄。安全
WebHost.CreateDefaultBuilder方法設置內容根目錄到當前目錄中:服務器
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); }
靜態文件能夠經過一個相對web root的路徑來訪問。app
例如,web application 項目模板在wwwroot文件夾下包含幾個文件夾:asp.net
到images子目錄中的文件的URI格式爲:http://<server_address>/images/<image_file_name> 。 例如,ide
http://localhost:9189/images/banner3.svg.svg
若是是.NET Framework, 添加 Microsoft.AspNetCore.StaticFiles包到項目中。若是是.NET Core, Microsoft.AspNetCore.App包含這個包。
配置中間件來容許提供靜態文件的服務。
1.Serve files inside of web root(在web root中提供files服務)
在Startup.Configure中調用UseStaticFiles方法:
public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); }
這個無參的UseStaticFiles方法標誌着web root中的文件能夠提供服務。下面的標籤引用 wwwroot/images/banner1.svg:
<img src="~/images/banner1.svg" alt="ASP.NET" class="img-responsive" />
在上面的代碼中,~/ 指向webroot,更多信息:Web root.
像上面的代碼,要使用web root下的文件,須要直接指向到web root下的具體的文件。
2.Serve files outside of web root(在web root外提供文件服務)
考慮下面的目錄層級,將在web root外面的MyStaticFiles提供文件服務。
經過配置靜態文件中間件(the Static File Middleware),使請求能夠取得banner1.svg文件:
public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); // For the wwwroot folder app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")), RequestPath = "/StaticFiles" }); }
在上面的代碼中,MyStaticFiles目錄經過StaticFiles 的URI被暴露。
一個 到http://<server_address>/StaticFiles/images/banner1.svg 的請求,能夠獲得banner1.svg文件。
下面的標記引用MyStaticFiles/images/banner1.svg文件:
<img src="~/StaticFiles/images/banner1.svg" alt="ASP.NET" class="img-responsive" />
3.Set HTTP response headers(設置HTTP響應頭)
StaticFileOptions 對象能夠被用來設置HTTP response headers(HTTP 響應頭)。
另外配置靜態文件服務於web root, 下面的代碼設置了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}"); } }); }
HeaderDictionaryExtensions.Append方法存在於Microsoft.AspNetCore.Http包中。
這個文件在開發環境能夠緩存10分鐘(600秒)。
靜態文件中間件不會提供受權檢查。任何被它提供的文件服務,包括在wwwroot下的,都是公開能夠訪問的。
要基於受權提供文件服務:
[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) { app.UseStaticFiles(); // For the wwwroot folder 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(); }
上面的代碼容許 wwwroot/images目錄下的目錄瀏覽,經過 http://<server_address>/MyImages
使用這個連接來到達每一個文件和目錄:
容許目錄瀏覽的一些安全風險,能夠看 Considerations
注意下面示例中的兩個UseStaticFiles的調用。
第一個調用容許wwwroot文件夾提供靜態文件。
第二個調用容許wwwroot/images文件夾使用目錄瀏覽,經過http://<server_address>/MyImages :
public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); // For the wwwroot folder 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" }); }
當訪問你的網站時,設置一個默認的home page頁面提供給瀏覽者一個合乎邏輯的起始頁(默認頁)(starting point)。
要提供一個默認的不須要用戶詳細修飾的URI的頁面,須要在Startup.Configure中調用UseDefaultFiles方法:
public void Configure(IApplicationBuilder app) { app.UseDefaultFiles(); app.UseStaticFiles(); }
重點:UseDefaultFiles 必須在UseStaticFiles以前被調用來提供默認文件。UseDefaultFiles是一個URL重寫器,它不會真正提供文件服務。容許Static File Middleware經過UseStaticFiles來提供服務。
使用UseDefaultFiles,請求一個文件夾搜索:
列表中第一個被找到的文件會提供服務,好像請求是被詳細修飾同樣。
下面的代碼改變默認文件名爲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(); }
UseFileServer結合了UseStaticFiles,UseDefaultFiles,和UseDirectoryBrowser的功能。
下面的代碼容許提供靜態文件服務和默認文件。目錄瀏覽沒被容許。
app.UseFileServer();
下面的代碼是創建在無參重載上的,容許目錄瀏覽:
app.UseFileServer(enableDirectoryBrowsing: true);
考慮下面的目錄層級:
下面的代碼容許MyStaticFiles中的靜態文件,默認文件和目錄瀏覽:
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 }); }
當EnableDirectoryBrowsing屬性值是true時,AddDirectoryBrowser必須被調用:
public void ConfigureServices(IServiceCollection services) { services.AddDirectoryBrowser(); }
使用文件層級和以前的代碼,URLs解析以下:
若是在MyStaticFiles目錄中,沒有默認名稱的文件存在,http://<server_address>/StaticFiles
返回目錄列表中被點擊的連接:
FileExtensionContentTypeProvider類包含一個映射屬性,這個映射屬性提供一個file extensions 到MIME content types 的映射。下面的代碼中,幾個文件擴展(file extensions)被註冊爲已知的MIME types。 .rtf extension被替換了,而且 .mp4 被移除了。
public void Configure(IApplicationBuilder app) { // Set up custom content types - associating file extension to MIME type var provider = new FileExtensionContentTypeProvider(); // Add new mappings provider.Mappings[".myapp"] = "application/x-msdownload"; provider.Mappings[".htm3"] = "text/html"; provider.Mappings[".image"] = "image/png"; // Replace an existing mapping provider.Mappings[".rtf"] = "application/x-msdownload"; // Remove MP4 videos. provider.Mappings.Remove(".mp4"); app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")), RequestPath = "/MyImages", ContentTypeProvider = provider }); app.UseDirectoryBrowser(new DirectoryBrowserOptions { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")), RequestPath = "/MyImages" }); }
Static File Middleware 理解幾乎400個已知的文件類型(file content types).
若是用戶請求一個未知的文件類型,Static File Middleware 會傳遞這個請求到管道上的下一個中間件。
若是沒有中間件能夠處理這個請求,一個404 Not Found 響應會被返回。
若是目錄瀏覽被容許,在目錄列表中,一個到這個文件的連接會被展現。
下面的代碼容許提供未知的類型,而且渲染未知的文件爲一個圖片:
public void Configure(IApplicationBuilder app) { app.UseStaticFiles(new StaticFileOptions { ServeUnknownFileTypes = true, DefaultContentType = "image/png" }); }
使用上面的代碼,一個對未知文件類型的請求會做爲一個圖片返回。
警告:容許ServeUnknownFileTypes是有安全風險的。它默認是被禁用的,而且這種用法不推薦使用。FileExtensionContentTypeProvider提供一個更安全的可選的方式來提供帶有non-standard extensions擴展的文件。
Considerations(考慮)
警告:若是IIS文件處理器被容許而且ASP.NET Core Module沒有被正確配置,靜態文件會提供服務。這會發生,例如,若是web.config文件沒有被部署。
地址:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-2.2