В чем разница между UseStaticFiles, UseSpaStaticFiles и UseSpa в ASP.NET Core 2.1? - программирование

В чем разница между UseStaticFiles, UseSpaStaticFiles и UseSpa в ASP.NET Core 2.1?

ASP.NET Core 2.1.1 предлагает несколько, казалось бы, связанных методов расширения для appBuilder:

  • UseStaticFiles от Microsoft.AspNetCore.StaticFiles
  • UseSpaStaticFiles из Microsoft.AspNetCore.SpaServices.Extensions
  • UseSpa от Microsoft.AspNetCore.SpaServices.Extensions

Пожалуйста, помогите мне понять их цель и отношение друг к другу?

Кроме того, есть ли разница с точки зрения выполнения сервера, если я запускаю эти методы в другом порядке (например, app.UseStaticFiles() → app.UseSpaStaticFiles() → app.UseSpa() против app.UseSpa() → app.UseSpaStaticFiles() → app.UseStaticFiles())?

4b9b3361

Ответ 1

Статические файлы, такие как HTML, CSS, изображения и JavaScript, являются активами, которые приложение ASP.NET Core обслуживает непосредственно клиентам. Некоторая конфигурация требуется, чтобы включить обслуживание этих файлов.

  • UseStaticFiles - обслуживать файлы внутри корня сети (папка wwwroot)

  • UseSpaStaticFiles - обслуживает статический файл, такой как image, css, js, в папке ресурсов углового приложения

  • UseSpa - пусть ядро asp.net знает, из какого каталога вы хотите запустить ваше угловое приложение, какую папку dist при запуске в рабочем режиме и какую команду запустить угловое приложение в режиме dev

пример

services.AddSpaStaticFiles(configuration =>
{
 configuration.RootPath = "ClientApp/dist";
});

app.UseSpa(spa =>
{
    // To learn more about options for serving an Angular SPA from ASP.NET Core,
    // see https://go.microsoft.com/fwlink/?linkid=864501

    spa.Options.SourcePath = "ClientApp";

    if (env.IsDevelopment())
    {
        spa.UseAngularCliServer(npmScript: "start");
    }
});

Ответ 2

  1. UseStaticFiles обслуживает файлы из wwwroot, но его можно изменить.
  2. UseSpaStaticFiles делает то же самое, но для этого требуется ISpaStaticFileProvider. Если app.ApplicationServices.GetService & lt; ISpaStaticFileProvider & gt;() вернет значение NULL, вы получите исключение.
throw new InvalidOperationException($"To use {nameof(UseSpaStaticFiles)}, you must " +
                    $"first register an {nameof(ISpaStaticFileProvider)} in the service provider, typically " +
                    $"by calling services.{nameof(AddSpaStaticFiles)}.");

Поэтому вам нужно вызвать app.AddSpaStaticFiles(), чтобы зарегистрировать по умолчанию ISpaStaticFileProvider

  1. UseSpa делает две вещи. Перезаписывает все запросы на страницу по умолчанию и пытается настроить обслуживание статических файлов. В отличие от UseSpaStaticFiles, он не выдает исключение, а просто возвращается к папке wwwroot.

Фактически UseSpaStaticFiles и UseSpa внутренне вызывают один и тот же метод UseSpaStaticFilesInternal, но с другим значением для третьего параметра, который является allowFallbackOnServingWebRootFiles. По этой причине UseSpaStaticFiles создает исключение, если ISpaStaticFileProvider не был зарегистрирован, просто не позволяет вернуться к wwwroot.

Кстати, если UseSpa внутренне возвращается к wwwroot, он вызывает старый добрый app.UseStaticFiles(staticFileOptions);

Ссылки на источники GitHub: 1. SpaDefaultMiddleware 2. SpaStaticFilesExtensions