Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态修改appsettings.json并刷新Web应用程序-ASP.NET Core和Docker_C#_Docker_Asp.net Core - Fatal编程技术网

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
in
Startup.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应用程序配置,因此它必须是可以实现的。看看这个:看看这个:酷-工作完美。谢谢。很酷-很好用。非常感谢。