我在尝试读取用户机密时遇到问题。我在startup.cs中的代码如下:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json",
optional: false,
reloadOnChange: true);
if (env.IsDevelopment())
{
builder.AddUserSecrets<Startup>(false);
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
从 appsettings.json 和环境变量读取工作正常,但无论我在 Secrets.json 文件中放入什么内容,都不会从中读取任何值。项目文件中UserSecretsId的值正确且env.IsDevelopment()为true。
配置包含三个提供程序。一个 JsonConfigurationProvider 包含来自 appsettings.json 的数据,一个 EnvironmentVariablesConfigurationProvider 包含来自环境变量的值,还有一个 JsonConfigurationProvider 没有数据。我认为后一种是添加用户机密的一种。但为什么是空的?
我不得不将一个项目分成两部分,但我一生都无法在生成的项目中加载秘密,它具有完全相同的项目环境,包括 VS2017 项目树中的
secrets.json
... .但它就是无法加载。
检查每个文件上的实际
.csproj
文件时,唯一的区别是生成的项目没有 UserSecretsId
条目,所以我只需右键单击该项目,点击 Manage User Secrets
,然后关闭随后的 Json编辑器,无需修改。
当我接下来运行该项目时,我原来的
secrets.json
已加载......而不是空白的。
看来,如果您的项目文件夹中有
secrets.json
,这会覆盖由 Manage User Secrets
创建的文件,该文件在 C:\Users\<user>\AppData\Roaming\Microsoft\UserSecrets\<userSercretsId>
中创建它们
我在测试项目中得到了这样的工作。 在 Startup.cs 中,我做了:
internal IConfigurationRoot Configuration { get; private set; }
public override void ConfigureTestServices(ref IServiceCollection services)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json",
optional: false,
reloadOnChange: true);
builder.AddUserSecrets<Startup>(false);
builder.AddEnvironmentVariables();
Configuration = builder.Build();
services.AddScoped<IConfigurationRoot>(option => Configuration);
// ... more settings
}
在配置文件里面,您可以通过简单地访问它
var secretValue = Configuration["SomeUserSecret"];
外部,在您的测试类中,您通过指定来使用依赖项注入
IConfigurationRoot config
在构造函数中并将配置分配给类属性,然后像
var secretValue = config["SomeUserSecret"];
这个有用的提示描述了您的项目的几个准备步骤。简而言之,您需要编辑 csproj 文件并且
<UserSecretsId>Insert New Guid Here</UserSecretsId>
<DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="2.0.0"/>
builder.AddUserSecrets(Assembly.GetExecutingAssembly(), true);
到
builder.AddUserSecrets(Assembly.GetEntryAssembly(), true);
我也有同样的问题。