Asp.net core 调试时进入ConfigurationBuilder对象的appsettings值错误
我正在运行一个.net core控制台应用程序,托管着aspnet core运行时。我正在使用3种不同的环境-Debug、Dev和Prod及其关联的appsettings json文件。所以我使用的是Startup类,但即使在使用启动代码之前,WebhostBuilder也已经安装好了。从文档中: 如果相同键的值由相同或不同的 在配置提供程序中,键上设置的最后一个值是 用过 好的,很好,也许我真的不明白正确的设置是如何进入config对象的,但请看下面我是如何添加根appsettings json文件的,然后是环境特定的文件,这似乎是可行的。 因此,最多应该引用两个appsettings和值 但是,稍后当配置对象被注入到我的启动类中的一个服务中时,我试图从配置对象中提取的值就不存在了。因为我的环境变量是Debug,所以它应该从appsettings.Debug.json文件中的值读取 在appsettings.json中Asp.net core 调试时进入ConfigurationBuilder对象的appsettings值错误,asp.net-core,Asp.net Core,我正在运行一个.net core控制台应用程序,托管着aspnet core运行时。我正在使用3种不同的环境-Debug、Dev和Prod及其关联的appsettings json文件。所以我使用的是Startup类,但即使在使用启动代码之前,WebhostBuilder也已经安装好了。从文档中: 如果相同键的值由相同或不同的 在配置提供程序中,键上设置的最后一个值是 用过 好的,很好,也许我真的不明白正确的设置是如何进入config对象的,但请看下面我是如何添加根appsettings js
-not there-
在appsettings.debug.json中
"AppSettings": {
"CustomerFilesRoot": "\\\\dev-haulops1\\d$\\BoxFiles",
另外,当我进入我的一个服务并查看已注入的配置对象时,我看到4个Json配置提供程序?为什么是4而不是2?深入到这些,appsettings.debug.json和appsettings.json中各有2个。我显然错过了什么
在我的程序中.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddEventLog();
})
.ConfigureAppConfiguration((context, config) =>
{
// Configure the app here.
var env = context.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
})
.UseStartup<Startup>();
[更新]
不确定是否有人注意到,我使用的是WebHost而不是普通主机,所以就像使用web应用一样,不需要添加appsettings文件。例如,在一个网络应用程序中,我有。因此,我仍在挠头,为什么在一个恰好使用aspcore运行时和WebHost的控制台应用程序中,它至少没有尝试使用与launchsettings.json文件中设置的环境变量相关联的文件。当我显式加载两个appsettings文件时,我在debugtime将它们作为configurationproviders加载,我可以看到两个,而不是前面提到的4个。问题是,当我从config对象提取一个值时,它会从文件中给我一个与环境变量不匹配的值
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
好吧,乍一看你缺少配置 不要忘记调用config.AddEnvironmentVariables;这将添加环境变量
.ConfigureAppConfiguration((context, config) =>
{
// Configure the app here.
var env = context.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
config.AddEnvironmentVariables();
})
为了便于参考,appsetting.json中的配置将按照与使用AddJsonFile加载的文件相反的顺序进行引用。换句话说,在您的案例中,将搜索appsettings.{env.env.Environment.json}以查找CustomerFilesRoot,如果找到,则立即返回值,如果没有,则将搜索appsettings.json以查找该值。好吧,乍一看,您缺少配置 不要忘记调用config.AddEnvironmentVariables;这将添加环境变量
.ConfigureAppConfiguration((context, config) =>
{
// Configure the app here.
var env = context.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
config.AddEnvironmentVariables();
})
为了便于参考,appsetting.json中的配置将按照与使用AddJsonFile加载的文件相反的顺序进行引用。换句话说,在您的案例中,appsettings.{env.Environment.json}将搜索CustomerFilesRoot,如果找到,则立即返回值,如果没有,则appsettings.json将搜索该值。您没有显示此部分,因此我不确定您是否正在执行此操作。但请确保您正在设置ASPNETCORE_环境变量 由于您使用的环境名称与开发、登台和生产环境不同,因此需要显式设置环境名称。有很多方法可以做到这一点。与launchSettings.json文件类似,例如: 参考文献: 但最终,您将需要确定当前运行的机器,并根据信息ASPNETCORE_ENVIRONMENT=Debug设置ASPNETCORE_环境变量
我认为在您这样做之前,IHostingEnvironment.Environment Name的行为将与您预期的不同。您没有显示此部分,因此我不确定您是否正在执行此操作。但请确保您正在设置ASPNETCORE_环境变量 由于您使用的环境名称与开发、登台和生产环境不同,因此需要显式设置环境名称。有很多方法可以做到这一点。与launchSettings.json文件类似,例如: 参考文献: 但最终,您将需要确定当前运行的机器,并根据信息ASPNETCORE_ENVIRONMENT=Debug设置ASPNETCORE_环境变量
我想在你这么做之前,我的名字会和你想象的不一样。赞美上帝,我发现了。事实证明appsettings.Debug.json文件毕竟存在问题。我当时正演这部电影。 配置正在将其全部拾取 ng,但设置的结构不同。然后我回忆起我从另一个项目复制了这些文件 看到区别了吗? 我读到的是:
"JobSettings" {
"SomethingHere" : "test",
"AppSettings": {
"setting1" : "val1"
}
}
"JobSettings" {
"SomethingHere" : "test",
} ,
"AppSettings": {
"setting1" : "val1"
}
我想我读的是:
"JobSettings" {
"SomethingHere" : "test",
"AppSettings": {
"setting1" : "val1"
}
}
"JobSettings" {
"SomethingHere" : "test",
} ,
"AppSettings": {
"setting1" : "val1"
}
如果有人正在关注同一问题,请检查以下内容:
1您是否设置了环境变量,并且是否已将其提取?
在启动构造函数中设置断点并检查environemnt.EnvironmentName
2仔细查看应用程序设置文件。您是否确实有一个文件具有appsettings.{environment}.json格式的匹配环境名称?您是否试图读取与代码所引用位置相同的值?赞美上帝,我找到了。事实证明appsettings.Debug.json文件毕竟存在问题。我当时正演这部电影。 配置一直在进行,但设置的结构不同。然后我回忆起我从另一个项目复制了这些文件 看到区别了吗? 我读到的是:
"JobSettings" {
"SomethingHere" : "test",
"AppSettings": {
"setting1" : "val1"
}
}
"JobSettings" {
"SomethingHere" : "test",
} ,
"AppSettings": {
"setting1" : "val1"
}
我想我读的是:
"JobSettings" {
"SomethingHere" : "test",
"AppSettings": {
"setting1" : "val1"
}
}
"JobSettings" {
"SomethingHere" : "test",
} ,
"AppSettings": {
"setting1" : "val1"
}
如果有人正在关注同一问题,请检查以下内容:
1您是否设置了环境变量,并且是否已将其提取?
在启动构造函数中设置断点并检查environemnt.EnvironmentName
2仔细查看应用程序设置文件。您是否确实有一个文件具有appsettings.{environment}.json格式的匹配环境名称?您正在尝试读取与代码尝试引用的位置相同的值吗?由于引用的是appsettings.json中的值,而不是特定于环境的文件中的值,因此仍然存在一些错误。奇怪的是,当我发布到一个文件夹时,它会按预期工作。只是调试时没有。有些地方仍然不正确,因为引用的是appsettings.json中的值,而不是特定于环境的文件。奇怪的是,当我发布到一个文件夹时,它会按预期工作。只是调试时没有。是的,我在launchsettings中设置它,我在launchsettings中设置它