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

时间:2019-05-05 01:03:12

标签: c# asp.net-core asp.net-core-2.0 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())运行这些方法,从服务器执行的角度来看有什么不同?

2 个答案:

答案 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)

  1. UseStaticFiles 提供来自wwwroot的文件,但可以更改。
  2. UseSpaStaticFiles 做类似的事情,但是它需要ISpaStaticFileProvider进行注册。如果 app.ApplicationServices.GetService ()返回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 相反,它不会引发异常,而只是回退到wwroot文件夹。

实际上,UseSpaStaticFiles和UseSpa都内部调用相同的方法UseSpaStaticFilesInternal,但是第三个参数的值不同,即 allowFallbackOnServingWebRootFiles 。这就是UseSpaStaticFiles抛出异常的原因,如果没有注册ISpaStaticFileProvider,则它根本不允许退回到wwroot。

顺便说一句,如果 UseSpa 内部回退到wwwroot,它将调用旧的好 app.UseStaticFiles(staticFileOptions);

链接到github源: 1. SpaDefaultMiddleware 2. SpaStaticFilesExtensions