.NET Core根据发布配置文件

时间:2017-10-24 16:57:16

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

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

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

你可能会问,为什么不同时做同样的服务。因为我只有1个开发服务器用于所有服务,并且生产中每个站点有1个服务器,所以必须拆分。

示例:

  • 服务实例1为网站US运行文件橡皮擦;
  • 服务实例2为网站CA运行文件橡皮擦;

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

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"我只会加载它,但我对此的所有尝试都失败了,它似乎不尊重发布配置文件,只是按照我在文件属性上设置的内容(复制到输出选项)。

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

1 个答案:

答案 0 :(得分:0)

为什么不使用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注入您需要的地方。

相关问题