当我的应用程序使用不同的 appsettings 文件时,为什么 AspNetCore Identity 脚手架不会加载其关联的 CSS 和 JS 文件?

Why will the AspNetCore Identity scaffolding not load its associated CSS and JS files when my app uses a different appsettings file?

我想添加一个“本地”appsettings 文件(称为“appsettings.Local.json”),其中包含用于在 individual/local 计算机。但是,当我将项目属性中的 ASPNETCORE_ENVIRONMENT 变量设置为“本地”时,我在 Chrome 控制台中收到一堆关于 CSS 和 JS 文件在我尝试时未加载的错误加载脚手架登录屏幕。

无论如何,零意义是当我将 ASPNETCORE_ENVIRONMENT 变量从“本地”更改回“开发”时,这些错误消失并且登录屏幕正确呈现。

可能值得注意的是,我的 Startup.cs 文件看起来像这样(将 env.IsDevelopment() 切换为 env.IsEnvironment("Local"); 但不管我在这里使用什么,登录屏幕的呈现没有明显变化)。

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsEnvironment("Local"))
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UseLoggingMiddleware(Configuration["TABLE_STORAGE_KEY"], Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"));

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        if (!env.IsEnvironment("Local"))
        {
            app.UseSpaStaticFiles();
        }

        app.UseRouting();

        app.UseAuthentication();
        app.UseIdentityServer();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });

        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.IsEnvironment("Local"))
            {
                //spa.UseAngularCliServer(npmScript: "start");
                spa.UseProxyToSpaDevelopmentServer("http://localhost:4200");
            }
        });
    }

可能相关:我最近也确实从 .NET Core 3.1 升级到 .NET 5,但我无法在网上找到任何关于这是我的问题的原因。

编辑:5/12/2021 01: 当 ASPNETCORE_ENVIRONMENT 设置为“本地”,因为我无法导航到 https://localhost:44395/Identity/lib/bootstrap/dist/js/bootstrap.bundle.min.js 除非 ASPNETCORE_ENVIRONMENT 设置为“开发”。但是为什么会这样呢?

ASP.NET Core Identity UI 使用静态 Web 资产,我在 中对此进行了详细解释。本质上,这会将 /Identity/ 的 URL 映射到以如下内容为根的文件路径:

/path/to/.nuget/packages/microsoft.aspnetcore.identity.ui/*.*.*/staticwebassets/V4

如链接的问答中所述,这仅在 Development 环境中开箱即用。在您的场景中,您需要 Local 环境,您可以在 Program.cs 中配置它(假设是典型设置),如下所示:

webBuilder.UseStartup<Startup>(); // This line is shown just for context.

// ...

webBuilder.ConfigureAppConfiguration((ctx, _) =>
{
    if (ctx.HostingEnvironment.IsEnvironment("Local"))
    {
        StaticWebAssetsLoader.UseStaticWebAssets(
            ctx.HostingEnvironment, ctx.Configuration);
    }
});

这确保静态 Web 资产映射也针对 Local 环境运行。

尽管@Kirk Larkin 的回答首先直接 resolves/explains 这个问题,但我在另一个问题上找到的另一个答案也值得注意,因为我认为那里的答案也能解决我的问题。

该问题的答案提到通过 运行 作为 Development 抓取 CSS 和 JS 文件并直接导航到文件,然后将内容复制到文件中并将它们粘贴到您的身份文件中当您切换到另一个环境(在我的例子中是本地)时,该目录显然会覆盖静态资产。对于想要覆盖默认值 CSS 以及 Identity 脚手架附带的诸如此类的东西的人来说,这个答案可能最有用。