使用 aspnet_regiis.exe 加密 web.config 将欧元符号更改为乱码

Using aspnet_regiis.exe to encrypt web.config changes euro sign to gibberish

在使用 Release Management 部署 WebApplication 后,我正在使用 PowerShell 脚本自动加密 web.config 的某些部分。在此 PowerShell 脚本中,我使用 aspnet_regiis.exe 为我执行加密,如下所示:

$AspNetRegIisLocation = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe"
& $AspNetRegIisLocation -pef $configSection $configPath

正确定义了 $configSection$configPath,因为加密工作成功。遗憾的是,它导致未加密部分之一的欧元符号从 <sharedSettings currencyFormat="{0:€ #,##0}" /> 损坏为 <sharedSettings currencyFormat="{0:€ #,##0}" />

我尝试将欧元符号转义为 &#8364; 并在我的 web.config 的顶部设置 encoding="utf-8" 打开和关闭。这些解决方案都不起作用,除了让脚本在加密之前复制所有部分并在之后重新插入未加密的部分之外,我有点不知所措,我可以做些什么来防止这种情况再次发生。

edit:当这一段也被加密时,网站上显示的文字也是'corrupted',也就是说'insert the unencrypted sections later'的解决方案并不能解决问题出现在加密部分。

事实证明,问题不在于使用 aspnet_iisreg,而在于在使用它之前在我的 PowerShell 中读取 web.config 的方法。

aspnet_iisreg 如果它们的类型驻留在 GAC 中未加载的 dll 中,则需要一种变通方法来加密自定义配置部分;您需要暂时删除或注释掉定义它们的 configSections 元素。

遗憾的是我用[xml](Get-Content $webConfigLocation)读入了web.config(之前没有出过问题,所以误怪了aspnet_iisreg)。相反,我应该使用 $configXml = [xml](Get-Content -Encoding UTF8 $webConfigLocation) 强制它使用 UTF-8 编码。

然后脚本会删除包含必须加密的部分的 configSections 元素并保存它,从而破坏过程中的欧元符号。在使用 aspnet_iisreg 加密配置部分后,它会再次读取 web.config ,插入先前删除的元素,然后最后保存它,从而导致额外的腐败迭代。

以防万一有人犯了类似的愚蠢错误,这个答案可以为他们提供一个可能的解决方案。