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

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

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

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

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

с помощью специального метода расширения UseDefaultFiles() можно настроить отправку статических веб-страниц по умолчанию без обращения к ним по полному пути:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
		app.UseDefaultFiles();
        app.UseStaticFiles();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World");
        });
    }
}

В этом случае при отправке запроса к корню веб-приложения типа http://localhost:xxxx/ приложение будет искать в папке wwwroot следующие файлы:

  • default.htm

  • default.html

  • index.htm

  • index.html

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

Если же мы хотим использовать файл, название которого отличается от вышеперечисленных, то нам надо в этом случае применить объект DefaultFilesOptions:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
		DefaultFilesOptions options = new DefaultFilesOptions();
        options.DefaultFileNames.Clear(); // удаляем имена файлов по умолчанию
        options.DefaultFileNames.Add("hello.html"); // добавляем новое имя файла
        app.UseDefaultFiles(options); // установка параметров
		
        app.UseStaticFiles();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World");
        });
    }
}

В этом случае в качестве страницы по умолчанию будет использоваться файл hello.html.

Метод UseDirectoryBrowser

Метод UseDirectoryBrowser позволяет пользователям просматривать содержимое каталогов на сайте:

public class Startup
{
	public void Configure(IApplicationBuilder app)
	{
		app.UseDirectoryBrowser();
		app.UseStaticFiles();
		app.Run(async (context) =>
		{
			await context.Response.WriteAsync("Hello World");
		});
	}
}
Метод app.UseDirectoryBrowser в ASP.NET Core

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

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using System.IO;

namespace HelloApp
{
    public class Startup
    {
        public void Configure(IApplicationBuilder app)
        {
            app.UseDirectoryBrowser(new DirectoryBrowserOptions()
            {
                FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\html")),

                RequestPath = new PathString("/pages")
            });
            app.UseStaticFiles();
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World");
            });
        }
    }
}

Чтобы задействовать новый функционал, надо подключить пространство имен using Microsoft.Extensions.FileProviders.

В качестве параметра метод UseDirectoryBrowser() принимает объект DirectoryBrowserOptions, который позволяет настроить сопоставление путей к файлам с каталогами. Так, в данном случае путь типа http://localhost:56431/pages/ будет сопоставляться с каталогом "wwwroot\html".

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

Перегрузка метода UseStaticFiles() позволяет сопоставить пути с определенными каталогами:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); // обрабатывает все запросы к wwwroot
    app.UseStaticFiles(new StaticFileOptions() // обрабатывает запросы к каталогу wwwroot/html
    {
        FileProvider = new PhysicalFileProvider(
			Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\html")),
        RequestPath = new PathString("/pages")
    });
			
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("Hello World");
    });
}

Первый вызов app.UseStaticFiles() обрабатывает запросы к файлам в папке wwwroot. Второй вызов принимает те же параметры, что и метод app.UseDirectoryBrowser() в предыдущем примере. И в отличие от первого вызова он обрабатывает запросы по пути http://localhost:xxxx/pages, сопоставляя данные запросы с папкой wwwroot/html. К примеру, по запросу http://localhost:56431/pages/index.html мы можем обратиться к файлу wwwroot/html/index.html.

Метод UseFileServer

Метод UseFileServer() объединяет функциональность сразу всех трех вышеописанных методов UseStaticFiles, UseDefaultFiles и UseDirectoryBrowser:

public void Configure(IApplicationBuilder app)
{
	app.UseFileServer();

    app.Run(async (context) =>
    {
            await context.Response.WriteAsync("Hello World");
    });
}

По умолчанию этот метод позволяет обрабатывать статические файлы и отправлять файлы по умолчанию типа index.html. Если нам надо еще включить просмотр каталогов, то мы можем использовать перегрузку данного метода:

app.UseFileServer(enableDirectoryBrowsing: true);

Еще одна перегрузка метода позволяет более точно задать параметры:

app.UseFileServer(new FileServerOptions
{
    EnableDirectoryBrowsing=true,
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\html")),
    RequestPath = new PathString("/pages"), 
	EnableDefaultFiles=false
});

В этом случае будет разрешен обзор каталога по пути http://localhost:xxxx/pages/, но при этом путь http://localhost:xxxx/html/ работать не будет.

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