Web.config 未在部署时参数化

Web.config not being parametrized on deploy

我有一个 ASP MVC 应用程序,我正在通过 TeamCity 部署到 Intranet 服务器,我需要一些 appSettings 在部署时进行参数化,以便对开发人员等隐藏客户端机密

我的项目根目录中有 Parameters.xml 文件,使用包构建的 SetParameters.xml 正确包含所有这些参数及其默认值。但是,更改这些值(甚至使用 -setParam 将它们传递给 MSDeploy)不会导致已部署的任何更改 web.config.

当我更改 SetParameters.xml 文件中的值(afaik 正确传递给 MSDeploy)时,已部署的 web.config 中的设置不会更改,而 "Verbose: Parameter entry 'IIS Web Application Name/1' is applicable" 日志中的条目(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 表达式工作正常。

web.config:

<?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:经过试验,我发现压缩包中生成的 parameters.xml 确实应该包含 "match" 和 "scope" 属性和他们没有 - 因为当我重写 xml 以便它包含具有适当匹配和范围的 parameterEntry,并将其重新打包到 zip 中时,它开始工作。

EDIT3:问题似乎是属性名为 "type",而它本应被命名为 "kind"。现在我只想知道,我第一次从哪里得到我使用的那个例子...

问题是我的 parameters.xml 中有一个名为 "type" 的属性,而它本应被命名为 "kind"。

感谢 https://forums.iis.net/t/1177518.aspx