C# 动态修改appsettings.json并刷新Web应用程序-ASP.NET Core和Docker
我目前正在尝试设计一个服务,作为配置的中心位置。但是,我注意到C# 动态修改appsettings.json并刷新Web应用程序-ASP.NET Core和Docker,c#,docker,asp.net-core,C#,Docker,Asp.net Core,我目前正在尝试设计一个服务,作为配置的中心位置。但是,我注意到Startup.cs中的ConfigurationServices中有相当多的服务使用了appsettings.json中的各种设置: 例如: services.AddDbContext<MyContext>(optionsAction: options => { options.UseSqlServer(Configuration.GetConnectionString(name: "somek
Startup.cs
中的ConfigurationServices
中有相当多的服务使用了appsettings.json
中的各种设置:
例如:
services.AddDbContext<MyContext>(optionsAction: options =>
{
options.UseSqlServer(Configuration.GetConnectionString(name: "somekey"));
});
services.AddDbContext(选项操作:选项=>
{
options.UseSqlServer(Configuration.GetConnectionString(名称:“somekey”);
});
我知道,如果我进入.net核心web应用程序的docker
容器,用nano
手动更改appsettings.json
中的内容并重新启动服务,它会确认并使用新配置。环境变量也是如此
但是,我正在尝试确定是否有可能动态更新/修改appsettings.json
,并在ConfigurationServices
inStartup.cs
中获取服务,以确认更改,而不实际重新启动服务
任何帮助都将不胜感激。这很容易做到 您需要将appsettings.json中的值替换为环境变量的名称 然后,当您运行Docker容器时,您可以传递这些变量的值(使用
-e
或-env file
标记Docker run
)
在Dockerfile中添加如下内容:
运行apt get update-y&&apt get install-y gettext base
复制entrypoint.sh/
运行chmod+x./entrypoint.sh
入口点[“/”入口点.sh“]
其中entrypoint.sh
为:
envsubt/tmp/appsettings.json&&cat/tmp/appsettings.json>/appsettings.json
dotnet.dll$@
这将用appsettings.json中的环境变量替换它们的变量,然后在启动容器时启动应用程序。因此,每个人的映像都是相同的(构建与往常一样),但是容器将根据传递的变量具有不同的appsetings.json文件。这很容易实现 您需要将appsettings.json中的值替换为环境变量的名称 然后,当您运行Docker容器时,您可以传递这些变量的值(使用
-e
或-env file
标记Docker run
)
在Dockerfile中添加如下内容:
运行apt get update-y&&apt get install-y gettext base
复制entrypoint.sh/
运行chmod+x./entrypoint.sh
入口点[“/”入口点.sh“]
其中entrypoint.sh
为:
envsubt/tmp/appsettings.json&&cat/tmp/appsettings.json>/appsettings.json
dotnet.dll$@
这将用appsettings.json中的环境变量替换它们的变量,然后在启动容器时启动应用程序。因此,每个人的映像都是相同的(构建与往常一样),但容器将根据传递的变量具有不同的appsetings.json文件。您可以使用
FileSystemWatcher
监视您的appsettings.json文件,并在引发Changed
事件时更新您的服务
编辑:
我能想到的最简单的实现是:
public class YourContextProvider : IContextProvider
{
private string _connectionString = "...some default value";
public YourContextProvider()
{
var watcher = new FileSystemWatcher()
{
Path = @"..."
};
watcher.Changed += (sender, args) =>
{
_connectionString = ...access your configuration
};
}
MyContext GetDbContext()
{
var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
optionsBuilder.UseSqlServer(_connectionString);
return new MyContext(optionsBuilder);
}
}
请注意不要在appsettings.json上初始化多个观察程序,这会导致性能问题(您应该只初始化它一次,可能会将它用作单例或其他东西)您可以使用
FileSystemWatcher
监视appsettings.json文件,并在引发更改事件时更新服务
编辑:
我能想到的最简单的实现是:
public class YourContextProvider : IContextProvider
{
private string _connectionString = "...some default value";
public YourContextProvider()
{
var watcher = new FileSystemWatcher()
{
Path = @"..."
};
watcher.Changed += (sender, args) =>
{
_connectionString = ...access your configuration
};
}
MyContext GetDbContext()
{
var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
optionsBuilder.UseSqlServer(_connectionString);
return new MyContext(optionsBuilder);
}
}
注意不要在appsettings.json上初始化多个观察程序,这会导致性能问题(您应该只初始化一次-可能将其用作单例或其他东西…您可以详细说明如何执行此操作吗?是的,请您再解释一下。我已经查找了FileSystemWatcher
,它的名字和它说的一模一样,但是它如何与web应用程序结合起来,在不重新启动的情况下动态地确认这些更改呢?感谢Daniel提供了更多的上下文。我会在某个时候开始调查。目前我正在寻找的主要问题是,动态更新配置和应用程序响应这些更改是可能的,您似乎在上面指出了这一点。我还发现了一个名为Steeltoe for.net core的东西,它使用Spring引导配置服务器,并声明可以通过执行器在运行时更新和读取.net core应用程序配置,因此它必须是可以实现的。您能详细说明如何做到这一点吗?是的,请您再解释一下。我已经查找了FileSystemWatcher
,它的名字和它说的一模一样,但是它如何与web应用程序结合起来,在不重新启动的情况下动态地确认这些更改呢?感谢Daniel提供了更多的上下文。我会在某个时候开始调查。目前我正在寻找的主要问题是,动态更新配置和应用程序响应这些更改是可能的,您似乎在上面指出了这一点。我还发现了一个名为Steeltoe for.net core的东西,它使用Spring引导配置服务器,并声明可以通过执行器在运行时更新和读取.net core应用程序配置,因此它必须是可以实现的。看看这个:看看这个:酷-工作完美。谢谢。很酷-很好用。非常感谢。