asp.core支援多個靜態檔案目錄以及指定預設頁的配置
阿新 • • 發佈:2020-12-04
Asp.Core中使用靜態檔案目錄,預設情況下直接使用app.UseStaticFiles(),會將站點下的wwwroot資料夾作為靜態檔案目錄,如果想支援多個資料夾作為靜態檔案目錄可以藉助CompositeFileProvider類來配置
//開啟多個靜態檔案目錄 app.UseStaticFiles(new StaticFileOptions { FileProvider = new CompositeFileProvider(new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, "wwwroot")), new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, "myweb"))), });
這樣wwwroot,myweb下的靜態檔案就可以訪問了。
但是開啟多靜態目錄後指定的預設頁面的就不能訪問了,可能是因為效能問題,core並不會遍歷所有資料夾幫你找預設頁面,研究了一番有兩種方法來解決這個問題:
1. 不使用app.UseDefaultFiles()來配置預設頁了,通過預設路由配置跳轉到/home/index 控制器中,在index方法中返回預設頁面資料:
app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); //預設控制器路由 }); public class HomeController : ControllerBase { public ActionResult Index() { var path = Path.Combine(AppContext.BaseDirectory, "wwwroot\\index.html"); return PhysicalFile(path, "text/html"); //直接返回index.html內容 } }
2. 繼續使用app.UseDefaultFiles()來配置預設頁,同時在IWebHostBuilder啟動配置時呼叫UseWebRoot()指定WebRoot目錄
//Startup.Configure方法中的程式碼 var options = new DefaultFilesOptions(); options.DefaultFileNames.Clear(); options.DefaultFileNames.Add("index.html"); //指定預設檔案 app.UseDefaultFiles(options); //開啟多個靜態檔案目錄 app.UseStaticFiles(new StaticFileOptions { FileProvider = new CompositeFileProvider(new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, "wwwroot")), new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, "myweb"))), }); app.UseEndpoints(endpoints => { //endpoints.MapDefaultControllerRoute(); endpoints.MapControllers(); }); public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder .UseWebRoot(Path.Combine(AppContext.BaseDirectory, "wwwroot")) //加上這句 預設檔案配置會生效 .UseStartup<Startup>(); }); }