Содержание
До этого момента мы изучали работу со статическими файлами, да и в целом работу с ASP.NET Core, не обращаясь к штатным middleware. Однако, ASP.NET Core содержит ряд методов и middleware, которые позволяют немного упростить обработку статических файлов в приложении. И сегодня мы начнем изучение обработки статических файлов с использованием middleware StaticFiles, который встраивается в конвейер обработки запросов ASP.NET Core методом расширения IApplicationBuilder.UseStaticFiles
.
Условности при использовании UseStaticFiles
Ранее, мы отправляли статические файлы пользователю без использования штатных средств ASP.NET Core следующим образом:
context.Response.ContentType = "text/html; charset=utf-8"; if (context.Request.Path == "/") await context.Response.SendFileAsync("index.html"); else if (context.Request.Path == "/data") await context.Response.SendFileAsync("data.html"); else { context.Response.StatusCode = 404; await context.Response.WriteAsync("<h2>Not Found</h2>"); }
При использовании middleware Static Files применяются следующие условности.
- По умолчанию для определения пути хранения статических файлов в проекте используются два параметра: ContentRoot и WebRoot (при работе с окружением мы можем получить или задать значения этих параметров через свойства
IWebHostEnvironment.ContentRootPath
иIWebHostEnvironment.WebRootPath
) - Cтатические файлы должны помещаться в каталог
ContentRoot/WebRoot
и, при этом, параметр WebRoot по умолчанию представляет папкуwwwroot
, которая должна располагаться в папкеContentRoot
.
UseStaticFiles
Чтобы продемонстрировать работу middleware создадим пустой проект ASP.NET Core, добавим в него папку wwwroot и создадим в этой папке файл с именем index.html. В обозревателе решений наш проект будет выглядеть следующим образом:
Содержимое файла будет максимально простым
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <h1>Index Page</h1> </body> </html>
Теперь подключим middleware в конвейер обработки запросов и напишем следующий код приложения:
public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.UseStaticFiles(); app.Run(async context => { await context.Response.WriteAsync("Not Found"); }); app.Run(); }
Здесь мы подключаем штатный middleware:
app.UseStaticFiles();
который будет обрабатывать статические файлы в папке wwwroot. Если указанный в пути файл не будет обнаружен, то пользователю будет отправлена строка «Not Found»
Вот как будет выглядеть наше приложение сразу после запуска:
и после указания в пути имени файла:
Проблема при запуске приложения, когда пользователь сразу видит «Not Found» также может быть решена штатными средствами ASP.NET Core, но об этом поговорим немного позднее. Пока же, мы должны усвоить, что middleware для работы со статическими файлами автоматически сопоставляет запросы с путями к статическим файлам в пределах папки wwwroot. То есть, если бы наш файл находился в папке wwwroot/html/files, то мы могли бы его получить, используя запрос вида https://localhost:[port]/html/files.
Изменение пути к статическим файлам
Хотя в подавляющем количестве случаев вполне достаточно и удобно хранить статические файлы в папке по умолчанию wwwroot, иногда можем потребоваться изменить этот путь на какой-либо другой. Чтобы это сделать, необходимо воспользоваться перегруженной версией метода WebApplication.CreateBuilder
и передать в параметре новые настройки следующим образом:
var builder = WebApplication.CreateBuilder(new WebApplicationOptions() { WebRootPath = "html" });
Чтобы проверить работу приложения, добавим в корневой каталог проекта папку html и в неё файл home.html
Содержимое файла home.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> Home Page </body> </html>
Теперь мы можем обратиться к этому файлу по новому пути.
Весь код приложения должен быть следующим:
namespace StaticFiles { public class Program { public static void Main(string[] args) { //устанавливаем новый путь к статическим файлам var builder = WebApplication.CreateBuilder(new WebApplicationOptions() { WebRootPath = "html" }); var app = builder.Build(); app.UseStaticFiles(); app.Run(async context => { await context.Response.WriteAsync("Not Found"); }); app.Run(); } } }
Использование файлов по умолчанию. Метод UseDefaultFiles
Осталось решить вопрос: как при запуске приложения загрузить пользователю сразу главную страницу приложения? Можно было бы снова написать свой middleware, а можно воспользоваться штатным middleware, который встраивается в конвейер запросов с помощью метода UseDefaultFiles
.
При использовании UseDefaultFiles
запрос к корню приложения, то есть по адресу https://localhost:[port]/
приведет к поиску в папке wwwroot
одного из следующих файлов:
default.htm
default.html
index.htm
index.html
Первый найденный файл из списка будет отправлен пользователю. Стоит отметить, что вызов UseDefaultFiles
должен идти перед UseStaticFiles
. Доработаем наше приложение:
namespace StaticFiles { public class Program { public static void Main(string[] args) { //устанавливаем новый путь к статическим файлам var builder = WebApplication.CreateBuilder(new WebApplicationOptions() { WebRootPath = "html" }); var app = builder.Build(); app.UseDefaultFiles(); //поддержка файлов по умолчанию app.UseStaticFiles(); app.Run(async context => { await context.Response.WriteAsync("Not Found"); }); app.Run(); } } }
В нашем проекте в папке wwwroot
уже есть файл index.html
, поэтому можно сразу запустить приложение и посмотреть его работу:
Загрузка файла по умолчанию:
запрос статического файла home.html
из папки html
:
прочие адреса:
Опять же, если имя файла, который мы хотим отправлять пользователю отличается от тех, которые ищутся в папке wwwroot, то мы можем воспользоваться второй версией метода UseDefaultFiles
и указать настройки файлов по умолчанию следующим образом:
var options = new DefaultFilesOptions(); options.DefaultFileNames.Add("home.html"); app.UseDefaultFiles(options); //поддержка файлов по умолчанию
Теперь при запуске приложения по умолчанию приложение будет искать в папке со статическими файлами файл home.html
.
Итого
В этой части мы воспользовались штатными средствами ASP.NET Core для обработки статических файлов и научились встраивать стандартные middleware в конвейер обработки запросов ASP.NET Core. UseStaticFiles
и UseDefaultFiles
упрощают обработку статических файлов, которые по умолчанию должны находится в папке wwwroot приложения.