在一个新的ASP.. NET Core托管站点,为什么改变ASPNETCORE_ENVIRONMENT到任何自定义值导致



如果我执行这些步骤:

  1. Open Visual Studio 2022
  2. 创建一个新的Blazor WebAssembly项目(我不认为模板很重要,任何ASP。. NET core托管的网站也一样)。使用dotnet run运行服务器自托管https配置文件,看到主机启动,浏览器显示默认的Blazor站点。
  3. 在启动设置。将ASPNETCORE_ENVIRONMENT更改为任意自定义值,如"Foo">
  4. 通过dotnet run
  5. 运行站点主机

预期:主机应该启动,浏览器应该完全像以前一样显示站点。它应该使用appsettings中的设置。

Actual:主机似乎启动了,但是浏览器得到404错误。似乎主机从来没有看到请求。

为什么ASP不能。. NET主机在环境不是"开发"时提供页面?我一定是缺少一些需要配置或删除?(我删除了UseHsts, UseWebAssemblyDebugging和usehttpredirection以确保,但它没有帮助。)

以上是我能够从头开始复制的最小示例——当然,我有自己的站点,我想使用替代的ASPNETCORE_ENVIRONMENT值(似乎在文档中明确允许),我将应用此答案。

这里是一个GitHub的repo,演示了这个问题。README。Md文件重申了上述内容。如何使用任意环境名来实现此功能?

这是ASP的设计行为。. NET Core Blazor.

在本地调试时,Blazor静态资产不放在{content root}/wwwroot/下,这是ASP. exe所在的路径。. NET Core默认查找静态资产。因此,微软有一个变通的解决方案,即在您的程序集旁边放置一个{application name}.staticwebassets.runtime.json文件,其中包含静态资产的实际路径(即在客户端项目下)。然后在运行时,它调用一些逻辑,以便服务器在实际路径下搜索静态文件,而不是在{content root}/wwwroot/下搜索。

问题是,默认情况下,只有在环境设置为Development时才启用此解决方案。你可以在这里看到。为了绕过这个限制,在。net 6和。net 5中,您可以在调用builder.Build();

之前添加以下行
builder.WebHost.ConfigureAppConfiguration((ctx, cb) =>
{
StaticWebAssetsLoader.UseStaticWebAssets(ctx.HostingEnvironment, ctx.Configuration);
});

注意,但这不是很安全,因为您的服务器可能会从任意位置提供文件。这就是为什么它在默认情况下只对开发启用。您可能应该将上面的行仅用于调试。

当你发布应用程序时,这不是一个问题,因为发布过程会将所有内容复制到一个输出目录,包括客户端项目wwwroot/中的Blazor静态资产。

在。net 7+中,这似乎比/u/scharnyw给出的。net 6答案要简单一些。对于。net 7及以上版本:

builder.WebHost.UseStaticWebAssets();

最新更新