靜態 HTML、CSS、圖檔和 JavaScript 之類的靜態檔案,一般都是由應用程式直接提供給客戶端。在 ASP.NET Core 應用程式中,需要做一些設定來提供這類型的靜態資源。
靜態檔案可以放在網站根目錄底下的任何路徑,預設目錄是在 /wwwroot,也可以透過 IWebHostBuilder.UseWepRoot
來設定應用程式的 webroot 路徑。使用 MVC 範本建立專案時,會自動產生以下目錄:
要啟用提供靜態檔案的服務,還需要在 Startup.Configure
方法中呼叫 UseStaticFiles
方法,將靜態檔案的中介層加入請求 pipeline 中。範例程式碼可以參考這邊。
public void Configure(IApplicationBuilder app)
{
// some middlewares
app.UseStaticFiles();
// some other middlewares
}
正確設定後,就可以在網頁中使用預設靜態目錄中的檔案了。
<img src="~/images/banner1.svg" alt="banner 1"/>
其實也可以將 webroot 以外的目錄作為靜態檔案的來源。假如現在有產生另一個目錄 AnotherStaticSource:
我們可以透過以下程式,將 AnotherStaticSource 也做為靜態檔案的目錄:
public void Configure(IApplicationBuilder app)
{
// some middlewares
app.UseStaticFiles();
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "AnotherStaticSource")),
RequestPath = "/AnotherStaticSource"
});
// some other middlewares
}
FileProvider
是設定取得檔案的方式;RequestPath
則是設定對應的請求路徑。依此設定後,便可以取得 AnotherStaticSource 目錄中的檔案了。
<img src="~/AnotherStaticSource/banner3.svg" alt="banner 3"/>
由 StaticFileMiddleware
提供的靜態檔案都可以公開存取,如果需要檢查存取合法性,需要:
UseStaticFiles
設定的靜態檔案目錄以外FileResult
物件public class StaticFilesController : Controller
{
public IActionResult Banner2()
{
var file = Path.Combine(
Directory.GetCurrentDirectory(),
"FileResults",
"banner2.svg");
return PhysicalFile(file, "image/svg+xml");
}
}
在 View 中使用這個語法來取得檔案:
<img src="@Url.Action("Banner2", "StaticFiles")" alt="banner 2" />