【问题标题】:.NET Core load correct configs based on publishing profile.NET Core 根据发布配置文件加载正确的配置
【发布时间】:2018-04-05 13:54:27
【问题描述】:

我使用PeterKottas.DotNetCore.WindowsService nugget 将 .NET Core 2.0 应用程序作为服务托管,到目前为止一切正常。

我的问题是该服务将在同一台服务器上有多个实例,根据配置文件运行不同的东西。

您可能会问,为什么不让相同的服务同时兼顾两者。因为我只有 1 台开发服务器用于所有服务,而生产中每个站点有 1 台服务器,所以必须拆分。

例子:

  • 服务实例 1 为站点 US 运行文件擦除器;
  • 服务实例 2 为站点 CA 运行文件擦除器;

实例 1 应加载“appsettings.US.json”和实例 2“appsettings.CA.json”。 “ASPNETCORE_ENVIRONMENT”环境变量不是解决方案,因为它是全局的并且会影响两个服务(在开发服务器中)。我目前有这个在本地运行:

string environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", false, true)
    .AddJsonFile($"appsettings.{environmentName}.json", true, true)
    .AddEnvironmentVariables();

两个站点也在同一个开发服务器中,但这很好,因为它是一个 Web.config 为每个特定站点在 IIS 中设置变量。我想知道服务是否有类似的东西,因为这对我的问题来说是一个很好的解决方案,但我一直在用头撞墙,什么也没找到。

其他可能的解决方案是仅发布正确的配置,然后将其重命名,以便将“appsettings.US.json”称为“appsettings.json”,而我只会加载它,但我所有的尝试都在这失败了,它似乎不尊重发布配置文件,只是做了我在文件属性上设置的内容(复制到输出选项)。

我是否可能在发布配置文件中做错了什么,是否有任何“环境变量”服务器特定类型的东西,或者是否有任何其他我不记得的解决方案?

【问题讨论】:

    标签: c# asp.net configuration app-config asp.net-core-2.0


    【解决方案1】:

    为什么不直接使用command-line configuration provider?然后,您可以在设置服务时指定所需的任何自定义设置作为启动参数。

    var builder = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", false, true)
        .AddJsonFile($"appsettings.{environmentName}.json", true, true)
        .AddEnvironmentVariables()
        .AddCommandLine(args);
    

    我会坚持让appsettings.{environment}.json 专注于传统环境,例如“开发”、“暂存”、“生产”等。然后,您可以为每个国家/地区 (?) 在设置中添加部分,例如:

    {
        ...
        "Countries": {
            "US": {
                "foo": "bar"
            },
            "CA": {
                "foo": "baz"
            }
        }
    }
    

    这样,您可以根据需要根据开发/生产自定义这些设置。然后,创建类:

    public class CountryConfig
    {
        public string Foo { get; set; }
    }
    

    ConfigureServices:

    var country = Configuration.Get<string>("country");
    services.AddSingleton(Configuration.GetSection($"Countries.{country}").Get<CountryConfig>());
    

    将以下设置为服务的启动参数:

    country=US
    

    最后,只需在需要的地方注入 CountryConfig

    【讨论】:

    • 这实际上是一个很好的解决方案,只是想知道是否没有任何基于配置的东西。如果没有出现,我会将其标记为已接受
    • 显然 PeterKottas 的掘金目前不允许这个解决方案,但已经在 github (github.com/PeterKottas/DotNetCore.WindowsService/issues/50) 上创建了一个问题,在此之前,这个答案对我没有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多