注意:这个问题现已解决 - 请参阅我的Update 3下面为解决方案。
我有一个 ASP.NET Core 2 Web 应用程序,需要连接到 SQL Server 数据库。根据我的Update 2下面我正在使用 IIS 调试应用程序。
我正在加载配置Program
类(因为我需要它来设置日志记录),如下所示:
public static IConfiguration Configuration => new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{EnvName ?? "Production"}.json", optional: true)
.AddUserSecrets<Startup>(false)
.Build();
My BuildWebHost
方法如下所示:
public static IWebHost BuildWebHost(string[] args)
{
return WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseConfiguration(Configuration)
.UseSerilog()
.Build();
}
My appSettings.json
文件有此部分:
{
"ConnectionStrings": {
"DefaultConnection": "*****" // secret
}
}
我使用 Visual Studio 中的上下文菜单将用户机密文件添加到项目中,复制上述部分,但使用真正的连接字符串。
一切就绪后,我的代码将引发有关连接字符串格式的异常。但是,如果我在主目录中替换“*****”appSettings.json
文件与真实的连接字符串应用程序工作正常。所以我认为它没有加载我的用户机密。
现在,我想使用重载AddUserSecrets
传递论点false
如果无法加载用户机密,将导致代码中断。但它并没有在这里破裂。我不知道我还能做什么。什么会导致 ASP.NET Core 无法加载用户机密?
Update 1
调试时,我可以在我的配置属性中看到它有我期望的 3 个提供程序:appsettings.json
, appsettings.Development.json
, and secrets.json
。但是,秘密提供程序的文件根目录是我的调试路径,而不是我的秘密文件的位置,即 C:\Users[用户名]\AppData\Roaming\Microsoft\UserSecrets...
Update 2
我意识到 Web 项目的调试设置指向一个 IIS 站点,该站点使用在ApplicationPoolIdentity
用户。这是否意味着用户机密需要位于 C:\Users[app-pool-user]\AppData\Roaming\Microsoft\UserSecrets 下而不是我自己的用户帐户下?我尝试将 GUID 命名的 Secrets.json 文件夹复制到此位置,但这没有帮助。但是,我尝试更改为在 IIS Express 下运行,这次用户机密are已加载。但由于各种原因,我需要能够在特定域名下调试此应用程序,那么如何才能将我的用户机密加载到我的 IIS 上下文中呢?我尝试更改应用程序池以使用我的主要 Windows 用户而不是AppPoolIdentity
但这并没有帮助。
更新3:已解决
嗯,今天我学到了一些东西!最终它是答案在这里 https://stackoverflow.com/questions/31049152/publish-to-iis-setting-environment-variable这解决了我的问题,但不是以我预期的方式。我从最初的问题(加载用户机密)继续前进,因为我意识到通过在 IIS 上托管,我实质上是在处理部署而不是临时调试会话。因此,我将用户机密移至环境变量(例如,在我的连接字符串示例中,添加系统环境变量ConnectionStrings:DefaultConnection
)并添加一个AddEnvironmentVariables()
到我的配置设置。但我仍然发现由于某种原因这些没有被加载到我的配置中。最后我发现感谢这个帖子 https://stackoverflow.com/questions/31049152/publish-to-iis-setting-environment-variableIIS 有一个地方可以添加隐藏在配置编辑器深处的本地环境变量。在这里添加我的变量解决了问题,意味着我现在可以在 IIS 中本地托管和调试,同时保证我的秘密安全。