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()
)运行这些方法,从服务器执行的角度来看有什么不同?
答案 0 :(得分:3)
静态文件(例如HTML,CSS,图像和JavaScript)是资产 ASP.NET Core应用程序直接为客户提供服务。一些配置是 需要启用这些文件的服务。
UseStaticFiles-在Web根目录(wwwroot文件夹)内提供文件
UseSpaStaticFiles-资产中的Servce静态文件,例如图像,css,js 角度应用程序文件夹
UseSpa-让asp.net核心知道您要运行哪个目录 angular应用,在生产模式下运行时是什么dist文件夹, 哪个命令可以在开发模式下运行angular app
示例
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 :(得分:1)
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
实际上,UseSpaStaticFiles和UseSpa都内部调用相同的方法UseSpaStaticFilesInternal,但是第三个参数的值不同,即 allowFallbackOnServingWebRootFiles 。这就是UseSpaStaticFiles抛出异常的原因,如果没有注册ISpaStaticFileProvider,则它根本不允许退回到wwroot。
顺便说一句,如果 UseSpa 内部回退到wwwroot,它将调用旧的好 app.UseStaticFiles(staticFileOptions);
链接到github源: 1. SpaDefaultMiddleware 2. SpaStaticFilesExtensions