我想在代码中获取当前环境的名称(QA / Prod / DEV),因此在调用AddJsonFile时可以使用该名称
*请注意,此代码不是针对应用程序的,而是针对使用带有NUNIT的测试资源管理器测试运行程序的硒单元测试的,因此我没有可以使用的Startup.cs类或ihostingenvironment。
我想这样做,我需要在launchsettings.json中检索“ Hosting:Environment”或“ ASPNETCORE_ENVironMENT”值,我认为该值应该表示当前的Visual Studio进程/会话/环境。有关如何获取该launchsettings.json值的信息,请参见下面的Environment.GetEnvironmentVariable("Hosting:Environment")
。
public static IConfiguration InitConfiguration()
{
LaunchSettingsFixture LaunchSettings = new LaunchSettingsFixture();
var environmentName = Environment.GetEnvironmentVariable("Hosting:Environment");
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json",optional: true,reloadOnChange: true)
.AddJsonFile($"appsettings.{environmentName}.json",true)
.AddEnvironmentVariables();
var configuration = builder.Build();
// Testing to see if the above worked
string url = configuration["url"];
string driverdirectory = configuration["driverdirectory"];
return configuration;
}
在上面的代码中,我期望Environment.GetEnvironmentVariable("Hosting:Environment")
返回一个值为“ blah”的字符串,因为我在当前进程/配置文件/环境下拉列表中选择了“ blah”(下拉菜单位于运行按钮)。请参阅下面的照片,了解我当前的流程/配置文件选择,并在下面的launchsettings.json文件中查看我的json文本...
{
"profiles": {
"Wikipedia.UITest": {
"commandName": "Project"
},"UAT": {
"commandName": "Executable","environmentVariables": {
"Hosting:Environment": "UAT"
}
},"blah": {
"commandName": "Executable","environmentVariables": {
"Hosting:Environment": "Development","containerName": "Testing"
}
},"Prod": {
"commandName": "Executable","environmentVariables": {
"Hosting:Environment": "prod"
}
}
}
}
相反,Environment.GetEnvironmentVariable("Hosting:Environment")
向我返回launchsettings.json文件内的最后一个实例(无论我如何选择下拉菜单,如屏幕快照中所示)。即返回“ prod”的值。再说一遍,我想说这是一个NUNIT NET CORE项目,我正在使用测试资源管理器来运行和调试测试(请参见下面的屏幕截图)
另外,我不知道下面的代码是否相关,但是下面是我如何设置环境变量的信息...
public class LaunchSettingsFixture
{
public LaunchSettingsFixture()
{
using (var file = File.OpenText("Properties\\launchSettings.json"))
{
var reader = new Jsontextreader(file);
var jObject = JObject.Load(reader);
var variables = jObject
.Getvalue("profiles")
//select a proper profile here
.SelectMany(profiles => profiles.Children())
.SelectMany(profile => profile.Children<JProperty>())
.Where(prop => prop.Name == "environmentVariables")
.SelectMany(prop => prop.Value.Children<JProperty>())
.ToList();
foreach (var variable in variables)
{
Environment.SetEnvironmentVariable(variable.Name,variable.Value.ToString());
}
}
}
}