.NET 4.8升级Microsoft.Configuration.ConfigurationBuilders至3.0后读取用户密钥失效
.NET 4.8中Microsoft.Configuration.ConfigurationBuilders 3.0读取UserSecrets为空的解决方法
问题背景
我开发的.NET 4.8应用中,将Microsoft.Configuration.ConfigurationBuilders(包含Environment、Json、UserSecrets组件)从2.0版本升级到3.0版本后,出现UserSecrets读取失败的问题:
已更新app.config中的配置构建器声明:
<configBuilders> <builders> <add name="Environment" type="Microsoft.Configuration.ConfigurationBuilders.EnvironmentConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.Environment, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <add name="Secrets" userSecretsFile="./App_Data/secrets.xml" mode="Greedy" type="Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.UserSecrets, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </builders> </configBuilders>
secrets.xml文件结构:
<root> <secrets ver="1.0"> <secret name="App:UserKey" value="Hello World"/> </secrets> </root>
升级前2.0版本中,通过以下代码可以正常读取配置值:
var userKey = System.Configuration.ConfigurationManager.AppSettings["App:UserKey"];
但升级到3.0版本后,上述代码返回空字符串。尝试修改文件路径为~/App_Data/secrets.xml、调整secrets.xml为标准configuration格式均无效,切回2.0版本则恢复正常。
解决方法
- 找到项目中的
secrets.xml文件,右键打开属性面板 - 将Copy to Output Directory属性从「Do not copy」修改为「Copy if newer」
- 重新编译并运行应用,即可正常读取secrets.xml中的配置值
版本差异说明
排查后发现,3.0版本的UserSecretsConfigBuilder仅从应用程序的输出目录(例如\bin\Debug\net48\win7-x86\App_Data)加载secrets.xml文件;而2.0版本的组件支持直接从项目目录读取该文件,因此无需设置文件的复制属性。这一行为变更可能未在官方更新文档中明确记录,是导致升级后出现问题的原因。
内容的提问来源于stack exchange,提问作者Bug Hunter Zoro
相关产品推荐
相关产品推荐

