1. 程式人生 > 其它 >ASP.NET5 中靜態檔案的各種使用方式服務端的靜態檔案開啟目錄瀏覽呈現預設檔案使用UseFileServer方法檔案型別基於IIS的考慮最佳實踐

ASP.NET5 中靜態檔案的各種使用方式服務端的靜態檔案開啟目錄瀏覽呈現預設檔案使用UseFileServer方法檔案型別基於IIS的考慮最佳實踐

所謂靜態檔案,包含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:SourceWebApplication1srcWebApplication1MyStaticFiles"),
      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:SourceWebApplication1srcWebApplication1MyStaticFiles"),
      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:SourceWebApplication1srcWebApplication1MyStaticFiles"),
    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