我有一个 ASP MVC 应用程序,我正在通过 TeamCity 部署到 Intranet 服务器,并且我需要在部署时对一些 appSettings 进行参数化,以便对开发人员等隐藏客户端机密。
我的项目根目录中有Parameters.xml 文件,使用包构建的SetParameters.xml 正确包含所有这些参数及其默认值。但是,更改这些值(甚至使用 -setParam 将它们传递给 MSDeploy)不会导致部署的 web.config 发生任何更改。
当我更改 SetParameters.xml 文件中的值(据此正确传递给 MSDeploy)时,部署的 web.config 中的设置不会更改,并且虽然存在“详细:参数条目 'IIS Web 应用程序名称/1'”是适用的”日志中的条目(IIS Web 应用程序名称是另一个标准参数),但没有提及我的 appSettings 参数。
另外,当我使用 IIS 管理器导入应用程序时,它会询问我这些参数的值,但我也没有在详细日志中看到它们,并且 web.config 根本不会更新,除非确实有一些参数更改,在这种情况下,参数不会被替换。
我的parameters.xml 看起来像这样:
<?xml version="1.0" encoding="utf-8" ?>
<parameters>
<parameter name="PiwikToken" defaultValue="__PIWIKTOKEN__">
<parameterEntry type="XMLFile" scope="\\web\.config$" match="/configuration/appSettings/add[@key='PiwikToken']/@value"/>
</parameter>
<parameter name="LoginClientSecret" defaultValue="__LOGINSECRET__">
<parameterEntry type="XMLFile" scope="\\web\.config$" match="/configuration/appSettings/add[@key='LoginClientSecret']/@value"/>
</parameter>
<parameter name="SecondClientSecret" defaultValue="__SECONDSECRET__">
<parameterEntry type="XMLFile" scope="\\web\.config$" match="/configuration/appSettings/add[@key='SecondClientSecret']/@value"/>
</parameter>
</parameters>
我尝试过其他范围变化(“web.config$”、“web.config”、“\\web.config$”、“\\web\.config$”、“Portal\web.config$”.. .)并且它没有改变任何事情。
针对我的 web.config 测试的 XPath 表达式工作正常。
网络配置:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="LoginClientId" value="portalLocal" />
<add key="RedirectAfterAuthUrl" value="https://localhost:44321/" />
<add key="PiwikSiteId" value="12" />
<add key="PiwikToken" value="__PIWIKTOKEN__" />
<add key="LoginClientSecret" value="__LOGINSECRET__" />
<add key="SecondClientSecret" value="__SECONDSECRET__" />
</appSettings>
<connectionStrings>
<add name="appDB" connectionString="..." />
</connectionStrings>
...
我检查过的其他事情:
.zip 包内生成的文件“parameters.xml”包含
<parameters>
<parameter name="IIS Web Application Name" defaultValue="Portal" tags="IisApp">
<parameterEntry kind="ProviderPath" scope="IisApp" match="^D:\\BuildAgent\\work\\fec2f9c37ed1ec8e\\Portal\\obj\\DEV\\Package\\PackageTmp$" />
<parameterEntry kind="ProviderPath" scope="setAcl" match="^D:\\BuildAgent\\work\\fec2f9c37ed1ec8e\\Portal\\obj\\DEV\\Package\\PackageTmp$" />
</parameter>
<parameter name="Add write permission to App_Data Folder" description="Add write permission to App_Data folder" defaultValue="{IIS Web Application Name}/App_Data" tags="Hidden">
<parameterEntry kind="ProviderPath" scope="setAcl" match="^D:\\BuildAgent\\work\\fec2f9c37ed1ec8e\\Portal\\obj\\DEV\\Package\\PackageTmp\\App_Data$" />
</parameter>
<parameter name="PiwikToken" defaultValue="__PIWIKTOKEN__" />
<parameter name="LoginClientSecret" defaultValue="__LOGINSECRET__" />
<parameter name="SecondClientSecret" defaultValue="__SECONDSECRET__" />
</parameters>
根据网上的各种消息来源,造成这种情况的常见原因是范围错误或匹配正则表达式错误,但我尝试了各种变体但没有成功。
如果有人对要尝试什么或可能的原因有任何想法,我很乐意进一步探索或尝试一下,但现在我已经花了几天时间在这上面,想不出还有什么可以尝试的。谢谢!
编辑:现在我已经使用 MVC 创建了一个新的 WebAPI 项目,仅添加了parameters.xml,将这些参数添加到了 web.config,但 web.config 在部署时仍然没有参数化。那么是某个 IIS 设置吗?
EDIT2:经过实验我发现生成的参数.xmlzip 包内部确实应该包含“match”和“scope”属性,但它们没有 - 因为当我重写 xml 使其包含具有正确匹配和范围的parameterEntry,并将其重新打包到 zip 中时,它就开始工作。
EDIT3:问题似乎是有名为"type",当它应该被命名时"kind"。现在我只是想知道,我第一次使用的例子是从哪里得到的......