По соображениям безопасности просмотр каталогов в ASP.NET Core отключен по умолчанию. Однако, если необходимо, то мы можем разрешить пользователя просматривать список каталогов и файлов на сервере.
Метод UseDirectoryBrowser
Метод UseDirectoryBrowser
позволяет пользователям просматривать содержимое каталогов на сайте. Вернемся к приложению из прошлой статьи и включим поддержку просмотра каталогов. Напомню, что структура проекта была следующей:
public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(new WebApplicationOptions() { WebRootPath = "html" }); var app = builder.Build(); app.UseDirectoryBrowser(); var options = new DefaultFilesOptions(); options.DefaultFileNames.Add("home.html"); app.UseDefaultFiles(options); app.UseStaticFiles(); //включаем поддержку просмотра каталогов app.UseDirectoryBrowser(); app.Run(async context => { await context.Response.WriteAsync("Not Found"); }); app.Run(); } }
Теперь запустим приложение и посмотрим на результат:
Как можно видеть, в список файлов выведены и файл index.html из папки wwwroot и файл home.html из папки html, которую мы указали в настройках приложения для обработки статических файлов. Такое поведение приложения ASP.NET Core характерно, когда приложение запускается в режиме отладки из Visual Studio. Если запустить приложение без отладки, например, из проводника Windows, то в список попадут только файлы, находящиеся в папке, установленной в качестве корневой для статических файлов:
Настройка просмотра каталогов на сервере
Метод UseDirectoryBrowser
имеет перегрузку, которая позволяет сопоставить определенный каталог в проекте определенным путем запроса. Например, создадим в папке wwwroot папку images и добавим туда какую-нибудь картинку:
Теперь разрешим пользователям просматривать содержимое этой папки, если задается путь
/pics
:
//включаем поддержку просмотра каталогов app.UseDirectoryBrowser(new DirectoryBrowserOptions() { FileProvider = new PhysicalFileProvider(Path.Combine(app.Environment.ContentRootPath, "wwwroot", "images")), RequestPath = "/pics" });
Теперь, если мы перейдем по URL http://localhost:[port]/pics/
, то увидим содержимое папки images
:
Метод UseFileServer
Еще один метод, который стоит упомянуть в части работы со статическими файлами в ASP.NET Core — это UseFileServer
. Этот метод объединяется в себе вызов сразу трех методов — UseStaticFiles
, UseDefaultFiles
и при необходимости UseDirectoryBrowser
. По умолчанию просмотр каталогов отключен. Чтобы включить все опции, которые мы использовали выше, достаточно вызвать версию UseFileServer
с настройками работы:
FileServerOptions serverOptions = new FileServerOptions() { EnableDefaultFiles = true, //испольхуем файлы по умолчанию EnableDirectoryBrowsing = true,//разрешаем просмотр каталогов }; //подключаем работу со статическими файлами app.UseFileServer(serverOptions);
При необходимости, в настройках FileServerOptions
можно настроить все те опции, которые мы настраивали выше, например, сопоставить путь в строке адреса браузера с физической папкой на диске и т.д, например,
FileServerOptions serverOptions = new FileServerOptions() { EnableDefaultFiles = true, //испольхуем файлы по умолчанию EnableDirectoryBrowsing = true,//разрешаем просмотр каталогов FileProvider = new PhysicalFileProvider(Path.Combine(app.Environment.ContentRootPath, "wwwroot", "images")), RequestPath = "/pics" }; //подключаем работу со статическими файлами app.UseFileServer(serverOptions);
Итого
В этой части мы рассмотрели ещё один момент работы со статическими файлами в ASP.NET Core — просмотр каталогов на сервере. Научились сопоставлять путь в URL с физическими папками на диске для просмотра каталога. При этом, вызов метода UseFileServer
позволяет настроить все опции работы со статическими файлами, рассмотренные в этой и предыдущей частях.