Ранее уже рассматривалась отправка статических файлов. В частности, для отправки файлов мы могли использовать метод SendFileAsync()
объекта HttpResponse:
var builder = WebApplication.CreateBuilder(); var app = builder.Build(); app.Run(async (context) => await context.Response.SendFileAsync("index.html")); app.Run();
Однако ASP.NET Core также предоставляет специальный встроенный middleware, который подключается с помощью метода UseStaticFiles() и который упрощает работу со статическими файлами.
При использовании этого middleware применяются некоторые условности. В частности,
по умолчанию для определения пути хранения статических файлов в проекте используются два параметра ContentRoot и
WebRoot, а сами статические файлы должны помещаться в каталог ContentRoot/WebRoot
. На стадии разработки параметр
"ContentRoot" соответствует каталогу текущего проекта. А параметр "WebRoot" по умолчанию представляет папку wwwroot в рамках
каталога ContentRoot. То есть, исходя из значений по умолчанию, то статические файлы следует
располагать в папке "wwwroot", которая должна находиться в текущем проекте. Однако эти параметры при необходимости можно переопределить.
В разных типах проектов ASP NET Core данная папка может уже быть по умолчанию в проекте, а может отсутствовать. Например, в проекте по типу Empty данная папка отсутствует, поэтому ее надо добавлять вручную.
Итак, возьмем проект по типу Empty и добавим в него новую папку wwwroot. Далее добавим в папку wwwroot новый файл index.html. То есть у нас получится следующий проект:
Изменим код файла index.html, например, следующим образом:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>METANIT.COM</title> </head> <body> <h1>Index Page</h1> </body> </html>
Для того, чтобы клиенты могли обращаться к этому файлу, подключим соответствующий компонент middleware с помощью метода UseStaticFiles()
:
var builder = WebApplication.CreateBuilder(); var app = builder.Build(); app.UseStaticFiles(); // добавляем поддержку статических файлов app.Run(async (context) => await context.Response.WriteAsync("Hello World")); app.Run();
Для подключения функциональности работы со статическими файлами применяется метод UseStaticFiles(), который реализован как метод расширения для типа IApplicationBuilder.
Теперь, если мы обратимся к добавленному файлу, например, по пути /index.html
,
то нам отобразится содержимое данной веб-страницы:
По всем остальным запросам браузер выводил бы строку "Hello World".
Если бы index.html находился бы в какой-то вложенной папке, например, в wwwroot/html/, то для обращения к нему мы могли бы использовать путь /html/index.html. То есть middleware для работы со статическими сайтами автоматически сопоставляет запросы с путями к статическим файлам в рамках папки wwwroot.
Что делать, если нас не устраивает стандартная папка wwwroot. И мы, к примеру, хотим, чтобы все статические файлы в проекте находились в папке static. Для этого добавим в проект папку static в проект и определим в ней какой-нибудь html-файл. Пусть он будет называться content.html:
Допустим, в этом файле будет какое-нибудь простейшее содержимое:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>METANIT.COM</title> </head> <body> <h1>Content from Static folder</h1> </body> </html>
Чтобы приложение восприняло эту папку, изменим код создания хоста в файле Program.cs:
var builder = WebApplication.CreateBuilder( new WebApplicationOptions { WebRootPath = "static"}); // изменяем папку для хранения статики var app = builder.Build(); app.UseStaticFiles(); // добавляем поддержку статических файлов app.Run(async (context) => await context.Response.WriteAsync("Hello World")); app.Run();
Для добавления пути к файлам используется перегруженная версия метода CreateBuilder(), которая в качестве параметра принимает объект WebApplicationOptions. Его свойство WebRootPath позволяет установить папку для статических файлов.
И после этого мы также сможем обращаться к статическим файлам из папки static: