Работа со статическими файлами

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

ASP.NET Core предоставляет возможности по настройке обработки статических файлов. Рассмотрим эти возможности.

Файлы по умолчанию

Допустим, в проекте в папке wwwroot располагается файл index.html:

Файлы по умолчанию и UseDefaultFiles в ASP.NET Core и Visual Basic .NET

Допустим, файл 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

Если файл будет найден, то он будет отправлен в ответ клиенту.

Файл по умолчанию index.html и UseDefaultFiles в ASP.NET Core и Visual Basic .NET

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

Метод 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
Метод UseDirectoryBrowser и просмотр содержимого каталога wwwroot в ASP.NET Core и Visual Basic .NET

Данный метод имеет перегрузку, которая позволяет сопоставить определенный каталог на жестком диске или в проекте с некоторой строкой запроса и тем самым потом отобразить содержимое этого каталога:

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".

UseDirectoryBrowser и сопоставление пути с каталогом файлов в ASP.NET Core и Visual Basic .NET

Сопоставление каталогов с путями

Перегрузка метода 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

Метод 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/ работать не будет.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850