.net - 在新的 ASP.NET Core 托管站点上,为什么将 ASPNETCORE_ENVIRONMENT 更改为任何自定义值会导致本地托管失败,但没有错误?

标签 .net asp.net-core kestrel-http-server

如果我执行以下步骤:

  1. 打开 Visual Studio 2022
  2. 创建一个新的 Blazor WebAssembly 项目(我认为模板并不重要,任何 ASP.NET Core 托管的网站都是相同的)。使用 dotnet run 运行服务器自托管 https 配置文件,并查看主机启动并且浏览器显示默认 Blazor 站点。
  3. 在服务器自托管 https 配置文件的 LaunchSettings.json 中,将 ASPNETCORE_ENVIRONMENT 更改为任何自定义值,例如“Foo”
  4. 使用 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/

相关文章:

.net - 包含 using 语句的单元测试方法

c# - 关于 iCustomFormatter 问题的 String.Format 与 int.ToString

.net Core WebApi 内容协商

asp.net-mvc - 使用依赖注入(inject)在 AspNetCore Mvc 中配置 CookieAuthenticationOptions

asp.net-core - 如何在 IdentityServer ASP.NET Core 中使用 Postman 调用带有 AntiForgeryToken 的 API

asp.net-core - 使用 FromBody 的路由不适用于 ASP.NET Core

c# - Silverlight 数据字段内容对齐

c# - 在 program.cs 中访问数据库上下文

asp.net-core - Kestrel + .NET Core (Windows) 的推荐身份/用户

c# - “操作无法完成,因为 DbContext 已被释放。”