. net核心控制台应用程序,如何配置每个环境的appSettings

本文关键字:配置 环境 appSettings 控制台 核心 应用程序 何配置 net | 更新日期: 2023-09-27 18:07:45

我有一个。net Core 1.0.0控制台应用程序和两个环境。我需要能够基于我在运行时设置的环境变量来使用appSettings.dev.jsonappSettings.test.json。对于ASP来说,这似乎是相当直接的。. NET Core web应用程序,通过依赖注入和IHostingEnvironment和环境名称env。变量,但是我应该如何为控制台应用程序连接东西(除了编写我自己使用Microsoft.Framework.Configuration.EnvironmentVariables的自定义代码)?

谢谢。

. net核心控制台应用程序,如何配置每个环境的appSettings

这就是我们在.netcore控制台应用程序中如何做到这一点。这里的关键是在您的项目中包括正确的依赖项,即(可能不是全部,根据您的需求检查)和复制到输出 appSetting。json作为你的buildoptions

的一部分
  {
    "buildOptions": {
    "emitEntryPoint": true,
    "copyToOutput": {
       "include": [
       "appsettings*.json",
       "App*.config"
                 ]
          }
},
using Microsoft.Extensions.Configuration;
namespace MyApp
{
    public static void Main(string[] args)
    {
        var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
       
        var builder = new ConfigurationBuilder()
            .AddJsonFile($"appsettings.json", true, true)
            .AddJsonFile($"appsettings.{environmentName}.json", true, true)
            .AddEnvironmentVariables();
        var configuration = builder.Build();
        var myConnString= configuration.GetConnectionString("SQLConn");
    }
}

从。Net Core 3.1++开始,通用主机类Microsoft.Extensions.Hosting.Host使用DOTNET_ENVIRONMENT环境变量代替ASPNETCORE_ENVIRONMENT。

在项目调试设置中设置DOTNET_ENVIRONMENT="Development"将无需任何额外编码即可工作。

或者您可以像这样添加自己的前缀:

// works for WPF but should work similar for Console Apps
public partial class App : Application
{
    private readonly IHost _host;
    public App()
    {
        _host = Host.CreateDefaultBuilder()
            .ConfigureHostConfiguration(configHost => {
                configHost.AddEnvironmentVariables(prefix: "PREFIX_");
            })
            .ConfigureServices((context, services) =>
            {
                ConfigureServices(context.Configuration, services);
            })
            .Build();
    }
    private void ConfigureServices(
        IConfiguration configuration,
        IServiceCollection services)
    {
       // ...
    }
    // ...
}

对于那些使用。net Core版本2.1.0+和Microsoft.Extensions.Hosting来托管您的控制台应用程序的人,您可以使用以下代码(根据飞宇周的回答在另一个线程):

var hostBuilder = new HostBuilder()
    .ConfigureHostConfiguration(config =>
    {
        if (args != null)
        {
            // enviroment from command line
            // e.g.: dotnet run --environment "Staging"
            config.AddCommandLine(args);
        }
    })
    .ConfigureAppConfiguration((context, builder) =>
    {
        builder.SetBasePath(AppContext.BaseDirectory)
            .AddJsonFile("appsettings.json", optional: false)
            .AddJsonFile($"appsettings.{context.HostingEnvironment.EnvironmentName}.json", optional: true);
    })

您应该使用两个IHostingEnvironment接口。一个是针对ASP的。另一个是。NET Core Applications,另一个是。NET Core Console Applications。您可以使用以下代码示例:

using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting.Internal;
namespace MyApplication.Common
{
    public static class ConfigurationFactory
    {
        /// <summary>
        /// Use for ASP.NET Core Web applications.
        /// </summary>
        /// <param name="config"></param>
        /// <param name="env"></param>
        /// <returns></returns>
        public static IConfigurationBuilder Configure(IConfigurationBuilder config, IHostingEnvironment env)
        {
            return Configure(config, env.EnvironmentName);
        }
        /// <summary>
        /// Use for .NET Core Console applications.
        /// </summary>
        /// <param name="config"></param>
        /// <param name="env"></param>
        /// <returns></returns>
        private static IConfigurationBuilder Configure(IConfigurationBuilder config, Microsoft.Extensions.Hosting.IHostingEnvironment env)
        {
            return Configure(config, env.EnvironmentName);
        }
        private static IConfigurationBuilder Configure(IConfigurationBuilder config, string environmentName)
        {
            return config
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables();
        }
        /// <summary>
        /// Use for .NET Core Console applications.
        /// </summary>
        /// <returns></returns>
        public static IConfiguration CreateConfiguration()
        {
            var env = new HostingEnvironment
            {
                EnvironmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production",
                ApplicationName = AppDomain.CurrentDomain.FriendlyName,
                ContentRootPath = AppDomain.CurrentDomain.BaseDirectory,
                ContentRootFileProvider = new PhysicalFileProvider(AppDomain.CurrentDomain.BaseDirectory)
            };
            var config = new ConfigurationBuilder();
            var configured = Configure(config, env);
            return configured.Build();
        }
    }
}

如果像我一样,您只是想为发布和开发模式拥有不同的配置文件,只需在文件的属性窗口中添加一个appsettings.Development.json文件,并将CopyToOutputDirectory设置为true。

现在,要根据构建配置访问文件,您可以使用#if DEBUG预处理器指令。

下面是一个例子:

static void Main(string[] args)
{
#if DEBUG
    var builder = new ConfigurationBuilder()
            .AddJsonFile($"appsettings.Development.json", true, true);
#else
    var builder = new ConfigurationBuilder()
            .AddJsonFile($"appsettings.json", true, true);
#endif
    var configuration = builder.Build();
    // ... use configuration
}

这些环境问题似乎对大多数ppl都有效,但我完全不同意所有这些环境管理。运行时和目标系统是否知道它是什么。只有作为开发人员或部署机制的您才知道目标系统是什么。

每个人都在谈论ASPNETCORE_ENVIRONMENT变量,甚至像这里https://learn.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-3.0这样的官方文档。但实际上,必须有人明确地将系统定义为生产系统,例如,通过手动设置ASPNETCORE_ENVIRONMENT一次。您真的想假设并依赖它,在您使用的每个环境中都已经设置好了吗?不,你不能。如果你必须将控制台应用程序部署到没有网站运行的批处理服务器上,该怎么办?ASPNETCORE_ENVIRONMENT不可用。如果你需要部署和运行一个没有IIS的。net核心webapi,只使用kestrel呢?没有网络。配置,没有环境变量。你希望你的管理员/运营团队为你的主机应用设置这个误导变量吗?在这种情况下,我看到很多项目都有这样的应用设置:

appsettings.json
appsettings.development.json
appsettings.test.json
appsettings.uat.json
appsettings.staging.json
appsettings.production.json

请记住,默认情况下,这些文件中的每一个都将被发布并部署到目标系统。乍一看,让环境"决定"应该使用哪个配置似乎很容易。但是,您在系统上部署了配置和潜在的凭据,而这些配置和凭据不适合它。

结论

我推荐appsettings。+ appsettings.release.json。第一个只适用于开发,你可以随心所欲地改变它。最后一个是为部署(流程)做好准备的VALID配置。在开始部署之前,转换配置以便为目标系统做好准备。就是这样。不需要依赖目标机器上的设置,不需要杂乱的配置。保持对应用的完全控制,即使服务器快速变化(如扩展,虚拟机,云,等等)

我感谢建设性的反馈:-)

它是这样的,对于一个dotnet 2。X核心控制台应用程序:

        using Microsoft.Extensions.Configuration;
        using Microsoft.Extensions.DependencyInjection;
        using Microsoft.Extensions.Logging;
        [...]
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();
        var serviceProvider = new ServiceCollection()
            .AddLogging(options => options.AddConfiguration(configuration).AddConsole())
            .AddSingleton<IConfiguration>(configuration)
            .AddSingleton<SomeService>()
            .BuildServiceProvider();
        [...]
        await serviceProvider.GetService<SomeService>().Start();

你可以注入ILoggerFactory, IConfiguration在SomeService .

任何人在。net core 3.1和使用。createdefaultbuilder (args)扩展。只需加上-environment "Development"到调试设置中的命令行参数。做。

根据文档,这些都是由默认的主机构建器自动提供的。要包含基于环境、命令行参数、环境变量、用户秘密(仅适用于开发环境)等的正确appsettings文件,唯一需要的代码是使用默认构建器:

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    {
        // configure services here
    })
    .Build();
host.Run();

关键是使用CreateDefaultBuilder()方法,它预先配置了所有这些源。您还可以使用fluent api分层其他源,例如内存中集合,它将优先于前面提到的源。

来源:

。. NET通用主机

Host.CreateDefaultBuilder() Method

您可以为ASP。Net Core环境变量(ASPNETCORE_ENVIRONMENT): -

using Microsoft.AspNetCore.Hosting;
using System;
public class Program {
    private static string HostingEnvironment => Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
    private static bool IsEnvironment(string environmentName) => HostingEnvironment?.ToLower() == environmentName?.ToLower() && null != environmentName;
    private static bool Development => IsEnvironment(EnvironmentName.Development);
    private static bool Production => IsEnvironment(EnvironmentName.Production);
    private static bool Staging => IsEnvironment(EnvironmentName.Staging);
    public static void Main(string[] args) { // Your code here }
}

那么你可以简单地使用

属性
    public static void Main(string[] args) {
        if (Development){
            // Blow up the planet
        }
    }

我这样使用来获取BaseURL的api从控制台应用程序调用配置.json文件

 public  class Helper
    {
        public static string GetConfigurationItems()
        {
            string? url;
            ConfigurationItems cf = new ConfigurationItems();
            var builder = new ConfigurationBuilder()
                               .AddJsonFile("appsettings.json", optional: true);
            IConfigurationRoot configuration = builder.Build();
            configuration.GetSection("ConfigurationItem").Bind(cf);
            url= cf.BaseURL;
            return url;
        }
       
    }

这是appsetting。json文件

    {
  "ConfigurationItem": {
      "BaseURL": "https://localhost:46356"
    }
  }

这是连接baseUrl和api的路由

            string apiURL = Helper.GetConfigurationItems() + 
"api/Employee/getAllEmployees";

,改变appsetting的设置。复制到输出目录= copy always