.NET Framework 4.8 UserSecretsConfigBuilder令牌替换不全问题求助
问题:UserSecretsConfigBuilder无法替换web.config中非appSettings/connectionStrings节的令牌
我正在使用Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder尝试更新web.config文件中的令牌。根据文档说明,构建器配置中的mode="Expand"(v3.0版本为mode="Token")应作用于web.config的原始XML,替换所有${...}格式的令牌,但实际使用中并未实现此效果。
我的configSections和configBuilders配置如下:
<configSections> <section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false" /> </configSections> <configBuilders> <builders> <add name="Secrets" userSecretsFile="~\secrets.xml" mode="Expand" optional="true" type="Microsoft.Configuration.ConfigurationBuilders.UserSecretsConfigBuilder, Microsoft.Configuration.ConfigurationBuilders.UserSecrets, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </builders> </configBuilders>
但运行应用时,以下内容安全策略的令牌未被替换:
<system.webServer> <httpProtocol> <customHeaders> <add name="Content-Security-Policy" value="${ContentSecurityPolicy}" /> </customHeaders> </httpProtocol> </system.webServer>
同样,system.serviceModel和system.net节中的令牌也未被替换。请问是文档描述错误,该工具仍仅处理appSettings和connectionStrings吗?这会带来很大困扰。
解答
- 没错,UserSecretsConfigBuilder(v2.0及更低版本)仅支持替换
appSettings和connectionStrings节中的令牌,文档中关于mode="Expand"作用于整个XML的描述存在误导或不准确。 - 即使设置了
mode="Expand",该构建器的核心逻辑依然只针对键值对形式的配置节(即appSettings和connectionStrings)进行令牌替换,不会遍历处理web.config中的所有XML节点值。 - 若要实现非标准配置节的令牌替换,可尝试以下方案:
- 升级到v3.0及以上版本的
Microsoft.Configuration.ConfigurationBuilders.UserSecrets,并配置mode="Token"——但需注意v3版本对非标准节的支持仍有限制,部分复杂节点可能无法处理; - 自定义配置构建器,实现遍历整个web.config XML节点并替换令牌的逻辑;
- 临时变通:将需要替换的值存入
appSettings,再在目标节中使用ASP.NET表达式引用(如value="<%$ AppSettings:ContentSecurityPolicy %>"),此方法仅适用于支持该表达式的配置节。
- 升级到v3.0及以上版本的
内容的提问来源于stack exchange,提问作者codeMonkey
相关产品推荐
相关产品推荐

