Статические файлы

Установка каталога статических файлов. UseStaticFiles

Последнее обновление: 20.12.2021

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

Статические файлы и папка wwwroot в ASP.NET Core и C#

Изменим код файла 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, то нам отобразится содержимое данной веб-страницы:

Обращение к статическим файлам в ASP.NET Core и C#

По всем остальным запросам браузер выводил бы строку "Hello World".

Если бы index.html находился бы в какой-то вложенной папке, например, в wwwroot/html/, то для обращения к нему мы могли бы использовать путь /html/index.html. То есть middleware для работы со статическими сайтами автоматически сопоставляет запросы с путями к статическим файлам в рамках папки wwwroot.

Изменение пути к статическим файлам

Что делать, если нас не устраивает стандартная папка wwwroot. И мы, к примеру, хотим, чтобы все статические файлы в проекте находились в папке static. Для этого добавим в проект папку static в проект и определим в ней какой-нибудь html-файл. Пусть он будет называться content.html:

Изменение пути к webroot в ASP.NET Core и C#

Допустим, в этом файле будет какое-нибудь простейшее содержимое:

<!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:

UseStaticFiles и WebRootPath в ASP.NET Core и C#
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850