C# 在ASP.NET Core 2.1中加载appsettings.{envName}.json文件

C# 在ASP.NET Core 2.1中加载appsettings.{envName}.json文件,c#,json,asp.net-core,appsettings,C#,Json,Asp.net Core,Appsettings,在中,我们可以为生产环境动态添加带有环境后缀的appsetting.json文件,如appsettings.Production.json 由于结构有点不同,现在似乎在classProgram中加载了配置。但是我们这里没有注入``,所以我自己用环境变量尝试了一下: public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build(

在中,我们可以为生产环境动态添加带有环境后缀的appsetting.json文件,如
appsettings.Production.json

由于结构有点不同,现在似乎在class
Program
中加载了配置。但是我们这里没有注入``,所以我自己用环境变量尝试了一下:

public class Program {
        public static void Main(string[] args) {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) {
            string envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
            string envConfigFile = $"appsettings.{envName}.json";

            var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile(envConfigFile, optional: true);

            var finalConfig = config.Build();
            return WebHost.CreateDefaultBuilder(args)
                .UseUrls("http://0.0.0.0:5000")
                .UseConfiguration(finalConfig)
                .UseStartup<Startup>();
        }
    }
此连接字符串正在工作。现在我创建
appsettings.Development.json

{
    "MyConnectionString": ""
}
并设置
ASPNETCORE\u ENVIRONMENT=Development
。这肯定会引发异常。但是应用程序可以从
appsettings.json
中的ConnectionString正确启动

根据,默认情况下,
WebHost.CreateDefaultBuilder
方法本身应该使用新的
ConfigureAppConfiguration
方法并加载特定于环境的配置。也就是说,
appsettings.{Environment}.json
是自动加载的。但这不起作用,而且像这样手动加载也不能解决问题:

return WebHost.CreateDefaultBuilder(args)
                .UseUrls("http://0.0.0.0:5000")
                .ConfigureAppConfiguration((builderContext, config) => {
                    IHostingEnvironment env = builderContext.HostingEnvironment;
                    config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
                })
                .UseStartup<Startup>();
返回WebHost.CreateDefaultBuilder(args)
.useURL(“http://0.0.0.0:5000")
.ConfigureAppConfiguration((builderContext,config)=>{
IHostingEnvironment env=builderContext.HostingEnvironment;
config.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true)
.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true,重载更改:true);
})
.UseStartup();

如何使用appsettings.{envName}.json“模式覆盖配置?我喜欢这一点,因为在ASP.NETCore中重写特定于环境的内容非常方便

您应该检查生成设置。如果希望项目加载特定环境,则应向编译器指定希望加载的环境设置

我希望有帮助。
祝你好运。

你应该检查你的构建设置。如果希望项目加载特定环境,则应向编译器指定希望加载的环境设置

我希望有帮助。
祝您好运。

您需要转到visual studio 2017c中的解决方案,单击解决方案,在菜单中单击“属性”>“构建”,您将看到已为名为Development的环境创建了环境变量。如果在给定web项目的“属性”页面中覆盖该值,它将从特定于应用程序环境的应用程序设置中提取环境变量。如果您的版本是2.1或更高版本,我也会保留您的web主机生成器默认代码。您需要在visual studio 2017c中转到您的解决方案,单击解决方案,在菜单中单击“属性”>“构建”,您将看到已为名为Development的环境创建了环境变量。如果在给定web项目的“属性”页面中覆盖该值,它将从特定于应用程序环境的应用程序设置中提取环境变量。如果您的版本为2.1或更高版本,我也会保留您的web主机生成器默认代码

请尝试使用
CreateDefaultBuilder()
,它将为您提供所需的配置设置(如中的示例所示)。请注意,如果您在Linux上运行,它是区分大小写的——如果文件名的大写字母P用于生产,那么环境变量的值也必须是。另外,检查文件是否位于正确的目录中-在运行时打印
directory.CurrentDirectory()
的值。这是他们应该去的地方


如果这样做有效,但实际上不需要默认生成器,只需从中复制所需的零件。

尝试使用
CreateDefaultBuilder()
,该工具应为您提供所需的配置设置(如中的示例所示)。请注意,如果您在Linux上运行,它是区分大小写的——如果文件名的大写字母P用于生产,那么环境变量的值也必须是。另外,检查文件是否位于正确的目录中-在运行时打印
directory.CurrentDirectory()
的值。这是他们应该去的地方


如果这样做有效,但您实际上不需要默认生成器,只需从中复制所需的零件。

发现我有一个用于迁移的自定义
DesignTimeDbContextFactory
类:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> {
        public ApplicationDbContext CreateDbContext(string[] args) {
            var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
            string connectionString = Config.GetConnectionString("AppDbContext");
            builder.UseMySql(connectionString);

            return new ApplicationDbContext(builder.Options);
        }
    }
所以问题是,ASP.NET核心的默认
ConfigureAppConfiguration
没有用于一致性。相反,我的解决方案只加载
appsettings.json
,因为在编写此类时,没有使用特定于环境的配置

我只需要像这样在这里添加加载:

    static IConfigurationRoot AppConfig {
        get {
            if (config == null) {
                var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
                config = new ConfigurationBuilder()
                         .SetBasePath(Directory.GetCurrentDirectory())
                         .AddJsonFile("appsettings.json")
                         // https://github.com/aspnet/MetaPackages/blob/rel/2.0.0/src/Microsoft.AspNetCore/WebHost.cs
                         .AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
                         .Build();
            }
            return config;
        }
    }

如果有人在这里有一个更干净的解决方案,允许我在EF迁移中使用默认的
ConfigureAppConfiguration
方法,我将不胜感激,因为在使用此类默认内容而不是自定义方法时,似乎不太容易出错

发现我有一个用于迁移的自定义
DesignTimeDbContextFactory
类:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> {
        public ApplicationDbContext CreateDbContext(string[] args) {
            var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
            string connectionString = Config.GetConnectionString("AppDbContext");
            builder.UseMySql(connectionString);

            return new ApplicationDbContext(builder.Options);
        }
    }
所以问题是,ASP.NET核心的默认
ConfigureAppConfiguration
没有用于一致性。相反,我的解决方案只加载
appsettings.json
,因为在编写此类时,没有使用特定于环境的配置

我只需要像这样在这里添加加载:

    static IConfigurationRoot AppConfig {
        get {
            if (config == null) {
                var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
                config = new ConfigurationBuilder()
                         .SetBasePath(Directory.GetCurrentDirectory())
                         .AddJsonFile("appsettings.json")
                         // https://github.com/aspnet/MetaPackages/blob/rel/2.0.0/src/Microsoft.AspNetCore/WebHost.cs
                         .AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
                         .Build();
            }
            return config;
        }
    }

如果有人在这里有一个更干净的解决方案,允许我在EF迁移中使用默认的
ConfigureAppConfiguration
方法,我将不胜感激,因为在使用此类默认内容而不是自定义方法时,似乎不太容易出错

根据文档,JSON配置提供程序应该自动加载两次(和 )
使用
CreateDefaultBuilder
时(因此将代码从单独的
ConfigurationBuilder
中移出)

当您使用ini时,会自动调用AddJsonFile两次
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.SetBasePath(Directory.GetCurrentDirectory());
            config.AddJsonFile(
                "config.json", optional: true, reloadOnChange: true);
        })
 public Startup(IHostingEnvironment env)
            {
                var builder = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                    .AddEnvironmentVariables();
                Configuration = builder.Build();
            }