В чем разница между UseStaticFiles, UseSpaStaticFiles и UseSpa в ASP.NET Core 2.1? - PullRequest
4 голосов
/ 05 мая 2019

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())?

Ответы [ 2 ]

5 голосов
/ 05 мая 2019

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

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

  • UseSpaStaticFiles - обслуживать статические файлы, такие как изображения, CSS, JS в активе папка углового приложения

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

Пример

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");
    }
});
1 голос
/ 10 июля 2019
  1. UseStaticFiles обслуживает файлы из wwwroot, но его можно изменить.
  2. UseSpaStaticFiles выполняет аналогичные действия, но для его регистрации требуется ISpaStaticFileProvider.Если app.ApplicationServices.GetService () возвращает ноль, то вы получите исключение.
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

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

На самом деле UseSpaStaticFiles и UseSpa внутренне вызывают один и тот же метод UseSpaStaticFilesInternal, но с разными значениями3-й параметр, который allowFallbackOnServingWebRootFiles .Это причина, по которой UseSpaStaticFiles генерирует исключение, если ISpaStaticFileProvider не был зарегистрирован, просто не позволяет вернуться к wwroot.

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

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

...