c# - 设置 Blazor Webassembly 环境的正确方法是什么?
问题描述
我的目标是能够从配置文件中更改环境名称。如果服务器是为 X 配置的,那么客户端也应该使用 X 环境。
您知道,在 ASP.NET 中,我们可以使用launchSettings.json
将 IIS 服务器配置为开发,以及发布到生产的“真实”服务器。WASM 客户端应该看到相同的配置。我只想在这里配置环境,以减少发布服务器时忘记某些东西的风险。
有多篇文章描述了 Blazor 环境,但我对正确设置它感到困惑。
为了让客户端看到环境,我在 Client/Program.cs 文件中添加了这一行:
Console.WriteLine("Using environment " + builder.HostEnvironment.Environment);
经验:
如果我将 Server/launchSettings.json/profiles/IIS Express/environmentVariables/ASPNETCORE_ENVIRONMENT 从 Development 更改为 Production,网站将无法加载(返回 404)。
在其他一些情况下,
ASPNETCORE_ENVIRONMENT
客户端只是忽略/无法访问。-
在本地运行应用程序时,环境默认为 Development。发布应用程序时,环境默认为生产环境。
有时对我来说是这样,但并非总是如此。在某些情况下,即使我在本地运行,环境也是生产环境。
Blazor.start({ environment: "Staging" });
本文中描述的没有效果。这也需要一个字符串,我怎么能传递服务器端配置变量的值?使用 web.config,我总是可以覆盖环境名称。有两个问题:
- 为什么要维护另一个配置文件?已经有 launchSettings.json,服务器将依赖于该文件。据我所知,我无法从 web.config 文件中引用其他设置。
- 它实际上不是
blazor-environment
控制环境名称的标题。为什么?删除 web.config
在 Server/Startup.cs 中,添加:
app.Use(async (context, next) => { context.Response.Headers.Add("blazor-environment", env.EnvironmentName); await next.Invoke(); });
在 Chrome DevTools 中,我可以看到 header 的值确实是 Development。但客户打印生产。
如果标题被忽略,我为什么要在 web.config 中设置它?它已设置,但 clinet WASM 项目不读取标题,它怎么知道名称?引用的 Blazor WASM JavaScript 文件是否已更改,环境名称是否编译为该文件?
还有生成的Client/launchSettings.json,好像完全被忽略了。
描述了至少 10 种获取环境名称的方法。有些人使用 appsettings.json (单独下载,或
IWebAssemblyHostEnvironment
,或IConfiguration
,或 Razor 组件等。我想要的只是读取 C# 代码部分中的全局环境名称。
我想这种混乱来自于 Blazor 在最近几年发生了变化。我有点失落。我应该使用哪一个?哪个应该始终有效?我可以摆脱同时更改 web.config 和 launchSettings.json 的需要吗?
解决方案
我使用的是 Blazor Server 而不是 Blazor Web Assembly,但我想你可以做我所做的,只需在 ASPNETCORE_ENVIRONMENT 变量中设置环境。在 Visual Studio 中调试时,在 launchSettings.json 文件中设置变量(请注意,如果您有多个配置文件,例如 IIS Express 和 YourProject,则每个配置文件都应该存在该变量(最好保持变量的值相同))。在服务器上运行应用程序时,ASPNETCORE_ENVIRONMENT 变量应作为环境变量存在于服务器(VM 或物理本地等)或 Azure 网站(又名 Azure 应用程序服务)作为 Settings->Configuration 下的变量。请注意环境变量,您通常必须注销运行时用户并重新启动服务,然后才能读取新值。
如果您有 env.IsDevelopment()、env.IsStaging() 或 env.IsProduction 等代码,则需要使用标准环境名称(Development、Staging 和 Production)。
对于 Blazor Server,在您调用的 Program.cs CreateHostBuilder 方法中Host.CreateDefaultBuilder(args).CongigureWebHostDefaults(webHostBuilder =>
您可以通过这种方式读取环境变量:
ConfigurationBuilder = new ConfigurationBuilder()
.AddEnvironmentVariables("ASPNETCORE_");
const string aspnetCoreEnv = "ASPNETCORE_ENVIRONMENT";
var environmentName = Environment.GetEnvironmentVariable(aspnetCoreEnv);
现在添加包含环境名称的相应 appsettings 文件:
ConfigurationBuilder.AddJsonFile($"appsettings.{EnvironmentName}.json", true, true);
var configuration = ConfigurationBuilder.Build();
webHostBuilder.UseConfiguration(configuration);
var hostBuilderEnvironmentSetting = webHostBuilder.GetSetting(WebHostDefaults.EnvironmentKey);
if (string.IsNullOrEmpty(hostBuilderEnvironmentSetting))
webHostBuilder.UseSetting(WebHostDefaults.EnvironmentKey, EnvironmentName);
如果您使用的是 Startup.cs,那么您可以使用构造函数注入,以便您可以访问 Startup 中的环境:
public Startup(IConfiguration configuration, IWebHostEnvironment hostingEnvironment)
如果 Blazor Web Assembly 配置不同,也许你仍然可以实现等效逻辑,使其加载与环境匹配的 appsettings。
使用这种方法,我没有遇到应用程序无法正确识别环境的问题。我没有 web.config 文件,因此不需要在那里维护值。我遇到的唯一“无法加载”问题是在 Azure 中,我的发布配置指定了一个“Microsoft 身份平台”,它引用了 Azure 应用程序注册,并且该应用程序注册在重定向 URI 下没有用于我的 URI 的 Web 平台特定于环境的应用服务。
推荐阅读
- mysql - 安装在子目录中的 Wordpress 访问 WP-Admin
- ios - 在从 Xcode 启动模拟器或设备之前删除应用程序
- angular - 如何在 Angular 中使用 import { onError } from 'apollo-link-error' 来处理所有错误
- python - BeautifulSoup4 find_all 从另一个对象调用时的奇怪行为
- c - NDK - 无法链接 C 共享库 libopusenc
- java - JAVA_HOME 指向无效的 Java 安装
- c# - 您可以用 HtmlDocument 中的 HtmlElement 替换 HtmlElement 吗?
- ajax - 如何在 Wordpress 中创建自定义电子邮件发件人文件?
- genexus - 可以在字符类型的变量中使用函数 max() 吗?
- java - onClick:更新可展开ListView的内容