如何对 mailSettings 文件执行 XML 变量替换?

Posted

技术标签:

【中文标题】如何对 mailSettings 文件执行 XML 变量替换?【英文标题】:How to perform XML variable substitution on mailSettings file? 【发布时间】:2021-05-20 05:18:46 【问题描述】:

我们有一个带有以下 system.net mailSettings 属性的 Web.config 文件:

<system.net>
    <mailSettings>
      <smtp configSource="mailSettings.config" />
    </mailSettings>
  </system.net>

mailSettings.config 文件位于项目子根目录下,仅包含以下几行:

<smtp from="reports@companyxyz.com" deliveryMethod="Network">
  <network enableSsl="true" host="smtp.sendgrid.net" port="587" userName="" password="" />
</smtp>

我们希望将用户名和密码属性存储为发布管道中的变量(最终存储在 Azure Key Vault 中,但不在此范围内),并且在 Azure 应用部署任务(下面的 yaml)中有一个 XML 选项变量转换/替换。

steps:
- task: AzureRmWebAppDeployment@4
  displayName: 'Deploy Azure App Service'
  inputs:
    azureSubscription: '$(Parameters.ConnectedServiceName)'
    appType: '$(Parameters.WebAppKind)'
    WebAppName: '$(Parameters.WebAppName)'
    enableCustomDeployment: true
    TakeAppOfflineFlag: false
    RenameFilesFlag: false
    enableXmlTransform: true
    enableXmlVariableSubstitution: true

我已经启用了,但是它怎么知道要转换 mailSettings.config 模板文件呢?

这是 XmlVariableSubstitution 开关的说明:

在构建或发布管道中定义的变量将与任何配置文件和 parameters.xml 的 appSettings、applicationSettings 和 connectionStrings 部分中的“key”或“name”条目匹配。变量替换在配置转换后运行。

注意:如果在发布管道和环境中定义了相同的变量,则环境变量将取代发布管道变量。

【问题讨论】:

【参考方案1】:

在您的情况下,标准替换将不起作用,因为您已经发现:

在构建或发布管道中定义的变量将与任何配置文件和 parameters.xml 的 appSettings、applicationSettings 和 connectionStrings 部分中的“key”或“name”条目相匹配。变量替换在配置转换后运行。

您仍然可以通过使用扩展来实现您的目标 - Replace Tokens

对于默认任务配置,您需要更改文件以将令牌定义为 #VARIABLE_NAME#。所以你的情况是:

<smtp from="reports@companyxyz.com" deliveryMethod="Network">
  <network enableSsl="true" host="smtp.sendgrid.net" port="587" userName="#USER_NAME#" password="#PASSWORD#" />
</smtp>

还要确保放置正确的目标文件。

【讨论】:

有趣!我安装了替换令牌,“还要确保放置正确的目标文件。”是什么意思?喜欢你说的路径吗? 是的,你的文件的路径。 如果我在配置文件中创建了管道变量userNamepassword,它们应该是:userName="#userName#" password="#password#" 对吧?我是否也将此任务放在 Azure App Deploy 任务之前?还是之后? 好的,要求稍微改变一下:我们不想替换用户名和密码值,而是希望将 web 配置中的这一行:&lt;smtp configSource="mailSettings.config" /&gt; 替换为值为&lt;smtp from="reports@companyxyz.com" deliveryMethod="Network"&gt; &lt;network enableSsl="true" host="smtp.sendgrid.net" port="587" userName="" password="" /&gt; &lt;/smtp&gt; 的管道变量。此外,由于开发人员不想更改 web 配置文件以适应替换令牌任务所需的前缀和足够的内容,我们希望使用自定义令牌前缀,例如:&lt;mailSettings&gt;

以上是关于如何对 mailSettings 文件执行 XML 变量替换?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Web.config 读取 system.net/mailSettings/smtp

asp.net邮件发送web.config怎么配置

如何解决“服务不可用,关闭传输通道。服务器响应是:服务器忙,连接太多“

加密web.config中的邮件配置mailSettings

如何使用 PHP 在 GCIDE XML 中进行搜索

如何对 XML 字符串执行类似 array.shift() 的命令?