Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Рассмотрим некоторые возможности, которые предоставляет нам ASP.NET Core для работы со статическими файлами.
с помощью специального метода расширения UseDefaultFiles() можно настроить отправку статических веб-страниц по умолчанию без обращения к ним по полному пути:
public class Startup { public void Configure(IApplicationBuilder app) { app.UseDefaultFiles(); app.UseStaticFiles(); app.Run(async (context) => { await context.Response.WriteAsync("Hello World"); }); } }
В этом случае при отправке запроса к корню веб-приложения типа http://localhost:xxxx/ приложение будет искать в папке wwwroot следующие файлы:
default.htm
default.html
index.htm
index.html
Если файл будет найден, то он будет отправлен в ответ клиенту. Если же файл не будет найден, то продолжается обычная обработка запроса с помощью следующих компонентов middleware. То есть фактически это будет аналогично, как будто мы обращаемся к файлу: http://localhost/index.html
Если же мы хотим использовать файл, название которого отличается от вышеперечисленных, то нам надо в этом случае применить объект DefaultFilesOptions:
public class Startup { public void Configure(IApplicationBuilder app) { DefaultFilesOptions options = new DefaultFilesOptions(); options.DefaultFileNames.Clear(); // удаляем имена файлов по умолчанию options.DefaultFileNames.Add("hello.html"); // добавляем новое имя файла app.UseDefaultFiles(options); // установка параметров app.UseStaticFiles(); app.Run(async (context) => { await context.Response.WriteAsync("Hello World"); }); } }
В этом случае в качестве страницы по умолчанию будет использоваться файл hello.html.
Метод UseDirectoryBrowser позволяет пользователям просматривать содержимое каталогов на сайте:
public class Startup { public void Configure(IApplicationBuilder app) { app.UseDirectoryBrowser(); app.UseStaticFiles(); app.Run(async (context) => { await context.Response.WriteAsync("Hello World"); }); } }
Данный метод имеет перегрузку, которая позволяет сопоставить определенный каталог на жестком диске или в проекте с некоторой строкой запроса и тем самым потом отобразить содержимое этого каталога:
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using System.IO; namespace HelloApp { public class Startup { public void Configure(IApplicationBuilder app) { app.UseDirectoryBrowser(new DirectoryBrowserOptions() { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\html")), RequestPath = new PathString("/pages") }); app.UseStaticFiles(); app.Run(async (context) => { await context.Response.WriteAsync("Hello World"); }); } } }
Чтобы задействовать новый функционал, надо подключить пространство имен using Microsoft.Extensions.FileProviders
.
В качестве параметра метод UseDirectoryBrowser()
принимает объект DirectoryBrowserOptions, который позволяет настроить сопоставление путей к файлам с
каталогами. Так, в данном случае путь типа http://localhost:56431/pages/ будет сопоставляться с каталогом "wwwroot\html".
Перегрузка метода UseStaticFiles()
позволяет сопоставить пути с определенными каталогами:
public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); // обрабатывает все запросы к wwwroot app.UseStaticFiles(new StaticFileOptions() // обрабатывает запросы к каталогу wwwroot/html { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\html")), RequestPath = new PathString("/pages") }); app.Run(async (context) => { await context.Response.WriteAsync("Hello World"); }); }
Первый вызов app.UseStaticFiles()
обрабатывает запросы к файлам в папке wwwroot. Второй вызов принимает те же параметры, что и метод app.UseDirectoryBrowser()
в предыдущем примере. И в отличие от первого вызова он обрабатывает запросы по пути http://localhost:xxxx/pages, сопоставляя данные запросы с
папкой wwwroot/html. К примеру, по запросу http://localhost:56431/pages/index.html мы можем обратиться к файлу wwwroot/html/index.html.
Метод UseFileServer() объединяет функциональность сразу всех трех вышеописанных методов
UseStaticFiles
, UseDefaultFiles
и UseDirectoryBrowser
:
public void Configure(IApplicationBuilder app) { app.UseFileServer(); app.Run(async (context) => { await context.Response.WriteAsync("Hello World"); }); }
По умолчанию этот метод позволяет обрабатывать статические файлы и отправлять файлы по умолчанию типа index.html. Если нам надо еще включить просмотр каталогов, то мы можем использовать перегрузку данного метода:
app.UseFileServer(enableDirectoryBrowsing: true);
Еще одна перегрузка метода позволяет более точно задать параметры:
app.UseFileServer(new FileServerOptions { EnableDirectoryBrowsing=true, FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\html")), RequestPath = new PathString("/pages"), EnableDefaultFiles=false });
В этом случае будет разрешен обзор каталога по пути http://localhost:xxxx/pages/, но при этом путь http://localhost:xxxx/html/ работать не будет.