site.css 在具有自定义环境的 .NET 6 Web App 中找不到

site.css not found in .NET 6 Web App with custom environment

使用最新的默认网络应用程序模板,例如dotnet new blazorserver,如果我将我的环境从 Development 更改为 LocalDevelopment,在本地调试我会丢失所有样式,因为我的 site.css 文件将找不到(我们使用这个本地调试时的自定义环境,以区别于我们共享的开发 Web 服务器上的 运行。)

我相信这是因为,根据文档,

static web assets are enabled by default in the Development environment. To support assets in other environments when running from build output, call UseStaticWebAssets on the host builder in Program.cs.

一种方法是使用 .NET 3.1/5 风格的托管模型,启用 UseStaticWebAssets:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStaticWebAssets();
                webBuilder.UseStartup<Startup>();
            });

我的问题是,如何使用 .NET 6 风格的托管模型完成此任务?我们希望为所有新应用程序使用新模型。我试过以下方法:

builder.WebHost.UseStaticWebAssets();

这会产生这个异常:

The web root changed from "C:\Web\BlazorServerApp\wwwroot" to "C:\Web\BlazorServerApp\". Changing the host configuration using WebApplicationBuilder.WebHost is not supported. Use WebApplication.CreateBuilder(WebApplicationOptions) instead.

我已经试过了:

builder.Host.ConfigureWebHost(c => c.UseStaticWebAssets());

我什至试过了,

var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
    WebRootPath = "wwwroot"
});

这最后一段代码似乎与意图相反;应用程序的根似乎设置为 / 而不是预期的 wwwroot,因为在浏览器调试 window 中它似乎正在寻找 /site.css 而不是 wwwroot/site.css.

有什么方法可以使用新的 .NET 6 托管模型/最小模板来在自定义环境中启用 StaticWebAssets 吗?

那太残酷了...我尝试了所有相同的方法但没有成功,但这奏效了 --

[assembly: HostingStartup(typeof(HelloCoreSix.MyAppHostingStartup))]

namespace HelloCoreSix
{
    public class MyAppHostingStartup : IHostingStartup
    {
        public void Configure(IWebHostBuilder builder)
        {
            builder.UseStaticWebAssets();
        }
    }
}

将以上内容放入 .cs 文件中,它将在 bootstrap 期间被拾取。

答案很明显:您应该将 Web Root Path 设置回“wwwroot”:

builder.WebHost.UseWebRoot("wwwroot");
builder.WebHost.UseStaticWebAssets();

WebApplicationBuilder builder = WebApplication.CreateBuilder(
    new WebApplicationOptions
    {
        Args = args,
        WebRootPath = "webroot"
    }
);
builder.WebHost.UseStaticWebAssets();

我不知道 .Net 6 的“正确”方式,但它有效