ASP.NET Core 2.1 中的 UseStaticFiles、UseSpaStaticFiles 和 UseSpa 有什么区别?

What is the difference between UseStaticFiles, UseSpaStaticFiles, and UseSpa in ASP.NET Core 2.1?

ASP.NET Core 2.1.1为appBuilder提供了几个看似相关的扩展方法:

请帮我弄清楚他们的目的和彼此之间的关系?

此外,如果我 运行 这些方法的顺序不同,从服务器执行的角度来看有什么不同吗

例如

app.UseStaticFiles() -> app.UseSpaStaticFiles() -> app.UseSpa()

app.UseSpa() -> app.UseSpaStaticFiles() -> app.UseStaticFiles()

Static files, such as HTML, CSS, images, and JavaScript, are assets an ASP.NET Core app serves directly to clients. Some configuration is required to enable serving of these files.

  • UseStaticFiles - 在 Web 根目录(wwwroot 文件夹)中提供文件

  • UseSpaStaticFiles - 提供静态文件,如图像,css,资源中的 js angular 应用的文件夹

  • UseSpa - 让 asp.net 核心知道您想要 运行 您的哪个目录 angular 应用程序,运行在生产模式下安装时的 dist 文件夹和 在开发模式下 运行 angular 应用程序的哪个命令

示例

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. UseStaticFiles 提供来自 wwwroot 的文件,但它可以更改。
  2. UseSpaStaticFiles 做类似的事情,但它需要注册 ISpaStaticFileProvider。如果 app.ApplicationServices.GetService() returns 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。

BTW 如果 UseSpa 在内部回落到 wwwroot 它调用旧的 app.UseStaticFiles(staticFileOptions) ;

github 来源的链接:

  1. SpaDefaultMiddleware
  2. SpaStaticFilesExtensions