我使用PowerShell脚本在使用Release Management部署WebApplication后自动加密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}" />
被破坏。
我尝试将欧元符号转义为€
,并在我的web.config顶部设置encoding="utf-8"
开启和关闭。这些解决方案都没有起作用,除了在加密之前使脚本复制所有部分并在之后重新插入未加密的部分之外,我还能做些什么来防止再次发生这种情况。
编辑:当此部分也被加密时,网站上显示的文本也“已损坏”,这意味着“稍后插入未加密的部分”的解决方案无法解决加密部分中出现问题的情况
答案 0 :(得分:0)
原来问题不在于使用aspnet_iisreg,而是在使用它之前在我的PowerShell中读取web.config的方法。
如果自定义配置节的类型位于未加载到GAC中的dll中,则aspnet_iisreg需要一种解决方法来加密自定义配置节。您需要暂时删除或注释掉它们所定义的configSections元素。
可悲的是,我使用[xml](Get-Content $webConfigLocation)
来读取web.config(之前没有引起麻烦,这就是为什么我错误地指责aspnet_iisreg)。相反,我应该使用$configXml = [xml](Get-Content -Encoding UTF8 $webConfigLocation)
强制它使用UTF-8编码。
然后,脚本将删除带有必须加密的部分的configSections元素并将其保存,从而破坏过程中的欧元符号。在使用aspnet_iisreg加密配置后,它将再次读取web.config,插入先前删除的元素,然后最终保存它,导致额外的损坏迭代。
万一有人犯了类似的愚蠢错误,这个答案可以为他们提供一个可能的解决方案。