ASP.NET Core предоставляет возможности по настройке обработки статических файлов. Рассмотрим эти возможности.
Допустим, в проекте в папке 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>
С помощью специального метода расширения UseDefaultFiles() можно настроить отправку статических веб-страниц по умолчанию без обращения к ним по полному пути:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main() Dim builder = WebApplication.CreateBuilder() Dim app = builder.Build() app.UseDefaultFiles() ' поддержка страниц html по умолчанию app.UseStaticFiles() ' добавляем поддержку статических файлов app.Run(Async Function(context As HttpContext) As Task Await context.Response.WriteAsync("Hello World") End Function) app.Run() End Sub End Module
В этом случае при отправке запроса к корню веб-приложения типа http://localhost:xxxx/ приложение будет искать в папке wwwroot следующие файлы:
default.htm
default.html
index.htm
index.html
Если файл будет найден, то он будет отправлен в ответ клиенту.
Если же файл не будет найден, то продолжается обычная обработка запроса с помощью следующих компонентов middleware. То есть фактически это будет аналогично, как будто мы обращаемся к файлу: http://localhost/index.html
Если же мы хотим использовать файл, название которого отличается от вышеперечисленных, то нам надо в этом случае применить объект DefaultFilesOptions:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main() Dim builder = WebApplication.CreateBuilder() Dim app = builder.Build() Dim options = New DefaultFilesOptions() options.DefaultFileNames.Clear() ' удаляем имена файлов по умолчанию options.DefaultFileNames.Add("hello.html") ' добавляем новое имя файла app.UseDefaultFiles(options) ' установка параметров app.UseStaticFiles() ' добавляем поддержку статических файлов app.Run(Async Function(context As HttpContext) As Task Await context.Response.WriteAsync("Hello World") End Function) app.Run() End Sub End Module
В этом случае в качестве страницы по умолчанию будет использоваться файл hello.html, который должен располагаться в папке wwwroot.
Метод UseDirectoryBrowser позволяет пользователям просматривать содержимое каталогов на сайте:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main() Dim builder = WebApplication.CreateBuilder() Dim app = builder.Build() app.UseDirectoryBrowser() ' добавляем поддержку просмотра папки app.UseStaticFiles() ' добавляем поддержку статических файлов app.Run(Async Function(context As HttpContext) As Task Await context.Response.WriteAsync("Hello World") End Function) app.Run() End Sub End Module
Данный метод имеет перегрузку, которая позволяет сопоставить определенный каталог на жестком диске или в проекте с некоторой строкой запроса и тем самым потом отобразить содержимое этого каталога:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Imports Microsoft.Extensions.FileProviders Module Program Sub Main() Dim builder = WebApplication.CreateBuilder() Dim app = builder.Build() app.UseDirectoryBrowser(New DirectoryBrowserOptions() With { .FileProvider = New PhysicalFileProvider(IO.Path.Combine(IO.Directory.GetCurrentDirectory(), "wwwroot\html")), .RequestPath = New PathString("/pages") }) app.UseStaticFiles() app.Run(Async Function(context As HttpContext) As Task Await context.Response.WriteAsync("Hello World") End Function) app.Run() End Sub End Module
Чтобы задействовать новый функционал, надо подключить пространство имен using Microsoft.Extensions.FileProviders
.
В качестве параметра метод UseDirectoryBrowser()
принимает объект DirectoryBrowserOptions, который позволяет настроить сопоставление путей к файлам с
каталогами. Так, в данном случае путь типа http://localhost:xxxx/pages/
будет сопоставляться с каталогом "wwwroot\html".
Перегрузка метода UseStaticFiles()
позволяет сопоставить пути с определенными каталогами:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Imports Microsoft.Extensions.FileProviders Module Program Sub Main() Dim builder = WebApplication.CreateBuilder() Dim app = builder.Build() app.UseStaticFiles() 'обрабатывает запросы к каталогу wwwroot/html app.UseStaticFiles(New StaticFileOptions() With { .FileProvider = New PhysicalFileProvider(IO.Path.Combine(IO.Directory.GetCurrentDirectory(), "wwwroot\html")), .RequestPath = New PathString("/pages") }) app.Run(Async Function(context As HttpContext) As Task Await context.Response.WriteAsync("Hello World") End Function) app.Run() End Sub End Module
Первый вызов app.UseStaticFiles()
обрабатывает запросы к файлам в папке wwwroot. Второй вызов принимает те же параметры, что и метод app.UseDirectoryBrowser()
в предыдущем примере. И в отличие от первого вызова он обрабатывает запросы по пути http://localhost:xxxx/pages
, сопоставляя данные запросы с
папкой wwwroot/html. К примеру, по запросу http://localhost:xxxx/pages/index.html
мы можем обратиться к файлу wwwroot/html/index.html.
Метод UseFileServer() объединяет функциональность сразу всех трех вышеописанных методов
UseStaticFiles
, UseDefaultFiles
и UseDirectoryBrowser
:
Imports Microsoft.AspNetCore.Builder Module Program Sub Main() Dim builder = WebApplication.CreateBuilder() Dim app = builder.Build() app.UseFileServer() app.Run() End Sub End Module
По умолчанию этот метод позволяет обрабатывать статические файлы и отправлять файлы по умолчанию типа index.html. Если нам надо еще включить просмотр каталогов, то мы можем использовать перегрузку данного метода:
app.UseFileServer(enableDirectoryBrowsing:=True)
Еще одна перегрузка метода позволяет более точно задать параметры:
Imports Microsoft.AspNetCore.Builder Module Program Sub Main() Dim builder = WebApplication.CreateBuilder() Dim app = builder.Build() app.UseFileServer(New FileServerOptions With { .EnableDirectoryBrowsing = True, ' разрешаем просмотр содержимого папки .EnableDefaultFiles = False ' отключаем поддержку файлов по умолчанию }) app.Run() End Sub End Module
Также можно настроить сопоставление путей запроса с каталогами:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.Extensions.FileProviders Imports Microsoft.AspNetCore.Http Module Program Sub Main() Dim builder = WebApplication.CreateBuilder() Dim app = builder.Build() app.UseFileServer(New FileServerOptions With { .EnableDirectoryBrowsing = True, .EnableDefaultFiles = False, .FileProvider = New PhysicalFileProvider(IO.Path.Combine(IO.Directory.GetCurrentDirectory(), "wwwroot\html")), .RequestPath = New PathString("/pages") }) app.Run() End Sub End Module
В этом случае будет разрешен обзор каталога по пути http://localhost:xxxx/pages/
, но при этом путь http://localhost:xxxx/html/
работать не будет.