Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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# 如何从最低级别值读取配置值_C#_Asp.net Core_Asp.net Core 2.0 - Fatal编程技术网

C# 如何从最低级别值读取配置值

C# 如何从最低级别值读取配置值,c#,asp.net-core,asp.net-core-2.0,C#,Asp.net Core,Asp.net Core 2.0,我正试图为我的应用程序提供一些配置数据,以便在源代码管理中存储简单的设置,但我们的部署系统在部署时将替换appsettings.json中的加密密钥 对于开发,我仍然需要一个通用密钥,但对于特定用户的机密,我希望提供一个他们可以确保安全的值 我的配置文件设置如下: appsettings.json { "SystemConfiguration" : { "EncryptionKey" : "weak" } } appsettings.Development.json {

我正试图为我的应用程序提供一些配置数据,以便在源代码管理中存储简单的设置,但我们的部署系统在部署时将替换appsettings.json中的加密密钥

对于开发,我仍然需要一个通用密钥,但对于特定用户的机密,我希望提供一个他们可以确保安全的值

我的配置文件设置如下:

appsettings.json

{
  "SystemConfiguration" : {
    "EncryptionKey" :  "weak"
  }
}
appsettings.Development.json

{
  "SystemConfiguration" : {
    "EncryptionKey" :  "devweak"
  }
}
在我的用户机密中

{
  "SystemConfiguration" : {
    "EncryptionKey" :  "this is a secret"
  }
}
在我的控制器构造中,我得到了注入的
I配置配置

然后

 public SysConfigController(IConfiguration configuration)
 {
     var result = configuration["SystemConfiguration:EncryptionKey"];
 }
但是结果的值总是“弱”,除非更高级别的设置文件根本不包含该值(
:null
)也不起作用


有什么方法可以检索最低级别的值吗?

您可以在Startup.cs中使用方法
ConfigureServices(iSeries收集服务)

在类中描述设置属性并将其绑定。例如:

services.Configure<SystemConfiguration>(options => Configuration.GetSection("SystemConfiguration").Bind(options));

public class SystemConfiguration
{
   public string EncryptionKey{get;set;}
}
services.Configure(选项=>Configuration.GetSection(“系统配置”).Bind(选项));
公共类系统配置
{
公共字符串加密密钥{get;set;}
}
然后,您可以使用DI来获取类

public class SomeClass
{
   private readonly SystemConfiguration _systemConfiguration{get;set;}
   public SomeClass (IOptions<ConfigExternalService> systemConfiguration)
   {
    _systemConfiguration = systemConfiguration;
   }
}
公共类SomeClass
{
私有只读系统配置_SystemConfiguration{get;set;}
公共类(IOPS系统配置)
{
_系统配置=系统配置;
}
}

您的配置注册似乎有误。将使用包含特定密钥的最后一次注册

例如,在
Program.cs
文件中(假设您使用的是ASP.NET Core,否则
Startup.cs
的ASP.NET Core 1.x构造函数),您可以覆盖注册(或者在使用默认主机生成器方法时只添加您喜欢的注册):

publicstaticiWebHostBuilderbuildWebHost(字符串[]args)=>
新WebHostBuilder()
.UseKestrel()
.UseContentRoot(目录.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext,config)=>
{
var env=hostingContext.HostingEnvironment;
配置
.AddJsonFile(“appsettings.json”,可选:true,重载更改:true)
.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true)
.AddUserSecrets()
.AddenEnvironmentVariables()
.AddCommandLine(args);
})
.Useii整合()
.UseStartup()
.UseApplicationInsights();
在本例中,注册了以下内容

  • .AddJsonFile(“appsettings.json”,可选:true,reloadOnChange:true)
    : 全局配置文件
  • .AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true)
    特定于环境的配置文件,即appsettings.Development.json
  • .AddUserSecrets()
    用户机密
  • .AddEnvironmentVariables()
    环境变量
  • .AddCommandLine(args)
    命令行参数
查找密钥时,搜索按相反顺序进行。如果将其定义为命令行参数,它将覆盖所有其他键和值(来自环境变量、用户机密、特定于环境和全局文件)

因此,将最不重要的文件放在开头,最重要的(覆盖)文件放在结尾

在这种情况下,如果它在用户机密中定义,它将覆盖
appsettings.Development.json
appsettings.json
提供的值

按照启动时指定配置提供程序的顺序读取配置源。本主题中描述的配置提供程序是按字母顺序描述的,而不是按代码可能排列它们的顺序。在代码中订购配置提供程序,以适合底层配置源的优先级

配置提供程序的典型顺序是:

  • 文件(appsettings.json、appsettings..json,其中是应用程序的当前托管环境)
  • 用户机密(机密管理器)(仅在开发环境中)
  • 环境变量
  • 命令行参数
通常的做法是将命令行配置提供程序放在一系列提供程序的最后,以允许命令行参数覆盖其他提供程序设置的配置


谢谢,但我应该提到我尝试过这种方法,但我仍然以“弱”而告终,我本应该得到“这是一个秘密”谢谢,我只是在家里玩完全相同的场景,试图重现工作中发生的事情,并且它正常工作。最低级别的细节是成功的。星期一我得再检查一下,看看有没有什么奇怪的事情发生。。我知道我正在使用2.1,返回WebHost.CreateDefaultBuilder(args.UseStartup();使用
WebHost.CreateDefaultBuilder(args)
时,它应该在开发模式下使用用户机密(如果是ASPNET\u ENVIRONMENT='development'),这是在调试Visual Studio表单时的情况,但在执行
dotnet run时则不是这样。在项目的早期,我们添加了一个额外的
.AddJsonFile($”appsettings.{username}.json”,可选:true,reloadOnChange:true)
,我还没有重新讨论过这个问题。它导致了问题,因为它已替换了CreateDefaultBuilder。感谢您的提醒。
public static IWebHostBuilder BuildWebHost(string[] args) =>
    new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;

            config
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddUserSecrets<Startup>()
                .AddEnvironmentVariables()
                .AddCommandLine(args);
        })
        .UseIISIntegration()
        .UseStartup<Startup>()
        .UseApplicationInsights();