如果 UseSpaStaticFiles() 应该为 Angular 页面提供服务,为什么仍然需要 UseSpa() ?

Ben*_*iss 5 c# asp.net-core asp.net-core-middleware angular asp.net-core-2.1

我在这里阅读了一些文章/博客文章和问题,但我仍然对ASP.NET Core 2.1 中的使用UseSpaStaticFiles()和中间件感到困惑。UseSpa()(参考文献: ASP.NET Core 2.1中的UseStaticFiles、UseSpaStaticFiles和UseSpa有什么区别? https://blog.steadycoding.com/usedefaultfiles-usestaticfiles-usespastaticfiles-usespa/

我将 Angular 项目模板与 ASP.NET Core 2.1 一起使用,该模板附带了一组预定义的中间件,已添加到文件中的管道中Startup.cs

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

public void Configure(IApplicationBuilder app)
{   

    app.UseStaticFiles();
    app.UseSpaStaticFiles();

   
    app.UseSpa(spa =>
    {
        if (env.IsDevelopment())
        {
            spa.UseProxyToSpaDevelopmentServer("http://localhost:4000");
        }
    });
    
}
Run Code Online (Sandbox Code Playgroud)

我的困惑如下:Angular 项目是在外部编译的,编译后的 js 文件位于该ClientApp/dist文件夹中,环境也设置为生产环境,所以我假设将UseSpaStaticFiles()服务于 Angular 页面,因为该ClientApp/dist文件夹具有正确的内容那。另外,UseSpa()中间件在这种情况下毫无用处,因此我可以删除该中间件。

但是,如果UseSpa()删除 ,则根本不会加载 Angular 页面,尽管 应该UseSpaStaticFiles()根据 的内容提供页面服务ClientApp/dist。(如果UseSpaStaticFiles()UseSpa()都添加到中间件管道中,则可以从该文件夹成功提供 Angular 页面ClientApp/dist,这意味着 Angular 页面可以UseSpaStaticFiles()提供服务。)

如果环境设置为生产,则UseSpa()根本不配置,只是将其添加到中间件管道中。

您能帮我澄清为什么没有 就UseSpaStaticFiles()无法为页面提供服务吗UseSpa()?为什么UseSpa()即使它不提供任何服务,也应该始终将其添加到管道中?我的配置中是否遗漏了导致此行为的某些内容?

pok*_*oke 5

UseSpa本质上是一个包罗万象的路由处理程序,它将所有以前未处理的路由转发到您的单页应用程序。这样,您的 SPA 就可以执行客户端路由之类的操作,而无需服务器应用程序知道客户端应用程序可以理解的所有路由。

相反,UseSpaStaticFiles是一个静态文件处理程序,仅提供已编译的应用程序文件,例如应用程序包,如app.jsvendor.js,在其各自的名称下,就像文件夹UseStaticFiles中的静态文件一样wwwroot