所謂靜態文件,包含HTML文件,css文件、圖片文件和js文件等,他們是服務器直接讀取到客戶端的一些資源,在這篇文章中,我們將解釋關於ASP.NET5和靜態文件的一些內容。
服務端的靜態文件
默認情況下,靜態文件被存放在項目的wwwroot目錄下,而wwwroot的地址被定義在project.json文件中:
{ "webroot": "wwwroot", ... }
靜態文件被存儲在wwwroot下的任何目錄中,它被客戶端以相對路徑的方式訪問,例如,當你在Visual Studio中創建一個默認的Web應用程序時,一些文件夾就已經創建在了wwwroot目錄下:js、images、css。直接反問這些問一個在images目錄中的圖片的路徑看起來應該是這樣的:
http://項目地址/images/圖片名稱
為了靜態文件可以被使用,你必須配置中間件(Middleware)在管道(pipeline)來添加靜態文件,這由在Startup類中的Configure方法中調用app的UseStaticFiles來完成:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ... // Add static files to the request pipeline. app.UseStaticFiles(); ...
現在,假設我們在項目中擁有一些你希望在項目中引用的靜態文件但是它處在wwwroot外部,例如以下這個示例:
- wwwroot
- css
- images
- ...
- MyStaticFiles
- test.png
為了讓用戶可以訪問到test.png文件,你可以向下文這樣配置靜態文件中間件:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ... // Add MyStaticFiles static files to the request pipeline. app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider(@"D:\Source\WebApplication1\src\WebApplication1\MyStaticFiles"), RequestPath = new PathString("/StaticFiles") }); ...
這樣處理之后,你可以使用http://<yourApp>/StaticFiles/test.png來訪問上文中所述的test.png文件。
開啟目錄瀏覽
目錄瀏覽可以讓應用程序的用戶看到指定目錄的文件和目錄列表,默認情況下,這個功能是沒有開啟的,如果用戶嘗試去顯示一個目錄,將會收到一個錯誤。開發人員可以通過調用app的UseDirectoryBrower擴展方法開啟這個功能:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ... // Turn on directory browsing for the current directory. app.UseDirectoryBrowser(); ...
然后,如果你訪問應用的images目錄,將會展示為這樣:
現在,假設我們存在一個想要被用戶訪問但是處在wwwroot外的文件夾MyStaticFiles,為了可以讓用戶通過目錄瀏覽查看到這個文件夾,可以這樣配置靜態文件中間件:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ... // Add the ability for the user to browse the MyStaticFiles directory. app.UseDirectoryBrowser(new DirectoryBrowserptions() { FileProvider = new PhysicalFileProvider(@"D:\Source\WebApplication1\src\WebApplication1\MyStaticFiles"), RequestPath = new PathString("/StaticFiles") }); ...
呈現默認文件
為了讓你的應用程序不需要URL全路徑就可以展示一個默認頁面給用戶,你可以通過調用app的UseDefaultFiles擴展方法來實現。注意你必須同樣調用UseStaticFiles方法,這是因為UseDefaultFiles方法只是重寫了URL。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ... // Serve the default file, if present. app.UseDefaultFiles(); app.UseStaticFiles(); ...
假如你知識這樣簡單的調用了UseDefaultFiles方法並且使用一個目錄的Url進行訪問,那么這個中間件將會搜索下列中的一個文件,假如他們中有一個被找到,那么這個文件將會作為默認的文件被展示:
- default.htm
- default.html
- index.htm
- index.html
為了可以允許指定一個默認的文件而不是上文中所述的這些,可以實例化一個DefaultFileOptions對象,並且設置它的DefaultFileNames屬性來指定默認文件,然后將這個對象傳給UseDefaultFiles方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ... // 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(); ...
現在,如果用戶瀏覽webroot目錄並且在這個目錄下存在一個mydefault.html文件,那么這個文件將會被瀏覽器顯示。
但是如果你向展示的默認文件不在wwwroot目錄下呢?你可以調用UseStaticFiles和UseDefaultFiles方法,並且給這兩個方法傳入相同的值,然后我們更推薦使用下文中將講述的UseFileServer方法。
使用UseFileServer方法
作為對UseStaticFiles、UseDefaultFiles和UseDirectoryBrowser方法的補充,有一個UseFileServer的方法集合前三個方法的功能為一身,我們可以這樣使用它:
// Enables all static file middleware (serving of static files, default files, and directory browsing). app.UseFileServer(enableDirectoryBrowsing: true);
現在,加入你想要展示存在於wwwroot目錄外部的文件,可以實例化並且配置一個options對象,然后你可以把它作為參數傳給UseFileServer方法。例如,現在存在這樣的目錄結構:
- wwwroot
- css
- images
- ...
- MyStaticFiles
- test.png
- default.html
你可能希望使用靜態文件並設置默認文件並且可以瀏覽MyStaticFiles目錄,在下文中的代碼段中,你可以只調用一個UseFileServer方法來實現這些需求:
// Enable all static file middleware (serving of static files, default files, // and directory browsing) for the MyStaticFiles directory. app.UseFileServer(new FileServerOptions() { FileProvider = new PhysicalFileProvider(@"D:\Source\WebApplication1\src\WebApplication1\MyStaticFiles"), RequestPath = new PathString("/StaticFiles"), EnableDirectoryBrowsing = true });
文件類型
ASP.NET 靜態文件中間件定義了將近400中文件類型,加入用戶視圖訪問一個中間件不包含的文件類型,ASP.NET將不會嘗試去提供這個文件。
假如現在存在如下的目錄結構:
- wwwroot
- css
- images
- test.image
- ...
使用這樣的目錄結構,你可以通過上文中所述方法開啟目錄瀏覽和靜態文件訪問的功能,你可以通過http://localtion/images 目錄看到test.image文件,但是當你點擊這個文件,你將收到一個404錯誤--就像它真的不存在似得。為了允許展示這些未知類型的文件,可以設置StaticFileOptions的ServeUnknownFileTypes屬性為true並且為DefaultContentType屬性設置相應的內容類型(參考常用MIME內容類型列表):
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ... // Serve static files and allow directory browsing. app.UseDirectoryBrowser(); app.UseStaticFiles(new StaticFileOptions { ServeUnknownFileTypes = true, DefaultContentType = "image/png" });
現在,如果瀏覽器試圖訪問一個未知類型的文件,瀏覽器將會把它當作一個圖片來渲染。
到目前為止,你已經看到如何為一個ASP.NET不識別的文件類型指定一個默認的內容類型,然而,如果你有多個文件類型是對於ASP.NET為止的改怎么辦?還好我們有FileExtensionContentTypeProvider類型。
FileExtensionContentTypeProvider包含一個內部的列表映射於MIME內容類型和文件后綴,指定一個自定義的內容類型,只需要簡單的實例化一個FileExtensionContentTypeProvider對象,然后添加一個映射到Mappings屬性,如下文所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ... // Allow directory browsing. app.UseDirectoryBrowser(); // Set up custom content types - associating file extension to MIME type var provider = new FileExtensionContentTypeProvider(); provider.Mappings.Add(".myapp", "application/x-msdownload"); // Serve static files. app.UseStaticFiles(new StaticFileOptions { ContentTypeProvider = provider }); ...
基於IIS的考慮
IIS用戶一個本地的靜態文件模塊,它不依賴於ASP.NET靜態文件中間件組件,ASP.NET模塊在IIS本地組件之前運行,它擁有比IIS本地組件更高的優先權,而在ASP.NET BETA 7中,IIS已經更改,所以沒有被ASP.NET處理的請求將會返回一個空的404響應,而不是由IIS本地模塊來執行,如果希望由IIS本地模塊來處理,在Configure方法的最后添加以下代碼:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ... ... // Enable the IIS native module to run after the ASP.NET middleware components. // This call should be placed at the end of your Startup.Configure method so that // it doesn't interfere with other middleware functionality. app.RunIISPipeline(); }
最佳實踐
代碼文件應該被置於應用程序的webroot目錄以外,這樣可以建立靜態文件和源代碼的完全的隔離。
原文地址:http://docs.asp.net/en/latest/fundamentals/static-files.html