По соображениям безопасности просмотр каталогов в 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 позволяет настроить все опции работы со статическими файлами, рассмотренные в этой и предыдущей частях.


