什么是 ASP.NET Core 静态 Web 资产?

Muh*_*eed 11 asp.net-core-mvc asp.net-core blazor

HostBuilder.ConfigureWebHostDefaults()(最终调用ConfigureWebDefaults)中有很多隐藏的魔法。我想更好地理解它,因为我找不到关于它的文档。

这段代码似乎正在加载一些静态文件。什么是静态网络资产,我们为什么需要它们?这与将静态资产嵌入 Blazor 的库有关吗?

builder.ConfigureAppConfiguration((ctx, cb) =>
{
    if (ctx.HostingEnvironment.IsDevelopment())
    {
        StaticWebAssetsLoader.UseStaticWebAssets(ctx.HostingEnvironment, ctx.Configuration);
    }
});
Run Code Online (Sandbox Code Playgroud)

Kir*_*kin 18

静态 Web 资产是从Razor 类库 (RCL) 中提供的静态文件:

RCL 可能需要可以由 RCL 的消费应用程序引用的配套静态资产。ASP.NET Core 允许创建包含可用于消费应用程序的静态资产的 RCL。

UseStaticWebAssets插入其他文件提供程序( 的实例StaticWebAssetsFileProvider),使用清单文件({environment.ApplicationName}.StaticWebAssets.xml如果未设置 via IConfiguration)来确定从路径到基本路径的映射列表。

例如,当使用 ASP.NET Core Identity UI RCL 时,应用程序的清单文件如下所示:

<StaticWebAssets Version="1.0">
    <ContentRoot BasePath="/Identity" Path="\path\to\.nuget\packages\microsoft.aspnetcore.identity.ui\3.0.0\staticwebassets\V4" />
</StaticWebAssets>
Run Code Online (Sandbox Code Playgroud)

这一切都结束了一个CompositeFileProvider为是集IWebHostEnvironment.WebRootFileProvider。这个复合提​​供者做了两件事:

  1. wwwroot/像往常一样处理静态文件(假设默认配置)。
  2. 将请求的任何文件委托wwwroot/Identity给为标识 UI 提取的 NuGet 包内容文件夹。

正如您问题中的代码片段所示,这仅在Development环境中运行时发生。当您的应用程序发布时,相关文件会被复制到wwwroot文件夹中,就好像它们是您应用程序的一部分一样。

  • 谢谢@kirk-larkin 的精彩回答。您能否澄清一下,如上一段所述,当发布应用程序时_相关文件如何复制到“wwwroot”文件夹中_?我有一个名为“测试”的环境,但这种魔法并没有发生;我需要设置/做什么才能使其适用于测试(除了手动调用 `StaticWebAssetsLoader.UseStaticWebAssets()` 之外)? (2认同)