1. 程式人生 > 實用技巧 >asp.core支援多個靜態檔案目錄以及指定預設頁的配置

asp.core支援多個靜態檔案目錄以及指定預設頁的配置

  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>();
                });
    }