我使用PeterKottas.DotNetCore.WindowsService nugget将.NET Core 2.0应用程序作为服务托管,到目前为止一切正常。
我的问题是,该服务将在同一服务器上有多个实例,这些实例根据配置文件运行不同的东西。
你可能会问,为什么不同时做同样的服务。因为我只有1个开发服务器用于所有服务,并且生产中每个站点有1个服务器,所以必须拆分。
示例:
实例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"我只会加载它,但我对此的所有尝试都失败了,它似乎不尊重发布配置文件,只是按照我在文件属性上设置的内容(复制到输出选项)。
我是否可能在发布配置文件中做错了,是否有任何"环境变量"服务器特定类型的东西,还是有任何其他我不记得的解决方案?
答案 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
注入您需要的地方。