В чем разница между 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()
)?
Ответы
Ответ 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
- UseStaticFiles обслуживает файлы из wwwroot, но его можно изменить.
- 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
- UseSpa делает две вещи. Перезаписывает все запросы на страницу по умолчанию и пытается настроить обслуживание статических файлов. В отличие от UseSpaStaticFiles, он не выдает исключение, а просто возвращается к папке wwwroot.
Фактически UseSpaStaticFiles и UseSpa внутренне вызывают один и тот же метод UseSpaStaticFilesInternal, но с другим значением для третьего параметра, который является allowFallbackOnServingWebRootFiles. По этой причине UseSpaStaticFiles создает исключение, если ISpaStaticFileProvider не был зарегистрирован, просто не позволяет вернуться к wwwroot.
Кстати, если UseSpa внутренне возвращается к wwwroot, он вызывает старый добрый app.UseStaticFiles(staticFileOptions);
Ссылки на источники GitHub:
1. SpaDefaultMiddleware
2. SpaStaticFilesExtensions