如何在网络核心C#中获取当前环境(QA / Prod / DEV)名称?

我想在代码中获取当前环境的名称(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文本...

如何在网络核心C#中获取当前环境(QA / Prod / DEV)名称?

    {
    "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项目,我正在使用测试资源管理器来运行和调试测试(请参见下面的屏幕截图)

如何在网络核心C#中获取当前环境(QA / Prod / DEV)名称?

另外,我不知道下面的代码是否相关,但是下面是我如何设置环境变量的信息...

    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());
                }
            }
        }

    }  
zl19890416 回答:如何在网络核心C#中获取当前环境(QA / Prod / DEV)名称?

根据@Mike Zboray的正确写法,VS和Rider都没有将当前的启动配置文件传递给测试运行程序,因此,到目前为止,尚无办法通过launchSettings.json设置环境变量。

关于LaunchSettingsFixture,它确实经过了所有设置并从每个配置文件中添加了每个环境变量,这就是为什么您总是看到最新的生产配置。在您提到作者的答案中,可能暗示在项目中使用了单个启动配置文件。

一种解决方法是使用构建配置设置并将有条件的appsettings。*。json复制到输出文件夹。类似于在.NET Core之前使用完整.NET Framework进行的操作。

在项目文件中,您可以根据构建配置文件配置要复制的文件:

<ItemGroup>
  <None Update="appsettings.$(Configuration).json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
  <None Update="appsettings.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

并复制了必需的配置文件后,您可以将它们添加到配置构建器中:

public static IConfiguration InitConfiguration()
{
    var settingsFiles = Directory.GetFiles(Directory.GetCurrentDirectory(),"appsettings.*.json"));
    if (settingsFiles.Length != 1) throw new Exception($"Expect to have exactly one configuration-specfic settings file,but found {string.Join(",",settingsFiles)}.");
    var settingsFile = settingsFiles.First();

    var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json",optional: true,reloadOnChange: true)
        .AddJsonFile(settingsFile)
        .AddEnvironmentVariables();
    var configuration = builder.Build();

    // Testing to see if the above worked
    string url = configuration["url"];
    string driverdirectory = configuration["driverdirectory"];

    return configuration;
}

请记住,现在您必须更改 Build Configuration (构建配置),而不是启动配置文件,才能针对所选环境运行测试。

本文链接:https://www.f2er.com/3148813.html

大家都在问