如果我执行以下步骤:
- 打开 Visual Studio 2022
- 创建一个新的 Blazor WebAssembly 项目(我认为模板并不重要,任何 ASP.NET Core 托管的网站都是相同的)。使用
dotnet run
运行服务器自托管 https 配置文件,并查看主机启动并且浏览器显示默认 Blazor 站点。 - 在服务器自托管 https 配置文件的 LaunchSettings.json 中,将 ASPNETCORE_ENVIRONMENT 更改为任何自定义值,例如“Foo”
- 使用
dotnet run
运行站点主机
预期:主机应该启动并且浏览器应该像以前一样显示站点。它应该使用 appsettings.json 中的设置,但当然不是 appsettings.Development.json 中的设置。
实际:主机似乎已启动,但浏览器收到 404 错误。主机似乎从未看到该请求。
当环境不是“开发”时,为什么 ASP.NET 主机不提供页面?我一定缺少一些需要配置或删除的部分? (我确实删除了 UseHsts、UseWebAssemblyDebugging 和 UseHttpsRedirection,但这没有帮助。)
上面是我能够从头开始重现的一个最小示例 - 当然,我有自己的网站,我想在其中使用替代的 ASPNETCORE_ENVIRONMENT 值(似乎 explicitly allowed in the docs ),我将应用这个答案。
这是一个GitHub repo that demostrates the problem 。 README.md 文件重申了上述内容。如何使用任意环境名称使其工作?
最佳答案
这是一个by-design behavior ASP.NET Core Blazor。
本地调试时,Blazor 静态资源不会放置在 {content root}/wwwroot/
下,这是 ASP.NET Core 默认查找静态资源的路径。因此,Microsoft 提供了一个解决方案,即在程序集旁边放置一个 {application name}.staticwebassets.runtime.json
文件,其中包含静态 Assets 的实际路径(即在 Client 项目下) )。然后在运行时,它会调用一些逻辑,以便服务器在实际路径下搜索静态文件,而不是{content root}/wwwroot/
。
问题是,默认情况下,只有当环境设置为开发
时才会启用此解决方法。可以看到here 。要解决此限制,在 .NET 6 和 .NET 5 中,您可以在调用 builder.Build();
builder.WebHost.ConfigureAppConfiguration((ctx, cb) =>
{
StaticWebAssetsLoader.UseStaticWebAssets(ctx.HostingEnvironment, ctx.Configuration);
});
但请注意,这不是很安全,因为您的服务器可能会从任意位置提供文件。这就是为什么它默认仅针对开发启用。您可能应该仅将上面的行用于调试。
不过,当您发布应用时,这不是问题,因为发布过程会将所有内容复制到一个输出目录,包括客户端项目的 wwwroot/
中的 Blazor 静态资源。
关于.net - 在新的 ASP.NET Core 托管站点上,为什么将 ASPNETCORE_ENVIRONMENT 更改为任何自定义值会导致本地托管失败,但没有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74435611/