首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果不存在,如何使用powershell将assemblyBinding bindingRedirect添加到web.config或app.config

如果不存在,如何使用powershell将assemblyBinding bindingRedirect添加到web.config或app.config
EN

Stack Overflow用户
提问于 2020-11-06 11:17:26
回答 1查看 665关注 0票数 1

我使用PowerShell来定制部署,我需要手动检查一个web.config是否存在一个特定的程序集bindingRedirect,如果没有,我需要添加它。

我发现了很多示例和材料,但是我很难检测绑定重定向是否存在,并且很难用嵌套的节点和属性创建实际元素。

web配置(相关部分):

代码语言:javascript
复制
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Linq" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.IO" publicKeyToken="B03F5F7F11D50A3A" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
        </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

我试过:

代码语言:javascript
复制
$XML.SelectSingleNode("/configuration/runtime/assemblyBinding[@xmlns='urn:schemas-microsoft-com:asm.v1']/dependentAssembly/assemblyIdentity[@name='System.IO']")

$XML.configuration.runtime.assemblyBinding.dependentAssembly.SelectSingleNode("assemblyIdentity[@name='System.IO']")

Select-Xml -Xml $XML -XPath '//assemblyIdentity[@name="System.IO"]'

上述任何操作都无法使元素在if语句中使用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-06 11:17:26

经过几个小时的尝试和阅读,我发现查找的主要问题是不能用纯文本指定的名称空间,更糟糕的是忽略它。对于要作为子节点添加的新元素的生成,我首先尝试使用元素属性设置的创建方法等等,但我的意图并不成功,而且不太干净。因此,我最终认为我可以从字符串创建一个XML,并将其转换为一个节点,从而使代码更简单、更清晰。

这是我的发现:

代码语言:javascript
复制
[xml]$XML = Get-Content -Path $File -Raw
$ns = New-Object System.Xml.XmlNamespaceManager($XML.NameTable)
$ns.AddNamespace("d", $xml.configuration.runtime.assemblyBinding.NamespaceURI)

if (-not ($XML.SelectSingleNode("//d:assemblyIdentity[@name='Microsoft.Extensions.Logging.Abstractions']", $ns))) {
    $loggingElement = [xml]@'
<dependentAssembly xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
</dependentAssembly>
'@
    $XML.configuration.runtime.assemblyBinding.AppendChild($XML.ImportNode($loggingElement.dependentAssembly, $true))
}
$XML.Save($File)

在读取了XML文件之后,我创建了一个命名空间,并在SelectSingleNode中使用它。一旦验证绑定重定向不存在,我就从string创建一个新的XML,并将其作为节点导入后作为子节点追加。

大多数相关链接用来找出迄今为止我最好的解决方案是什么:

Checking if content is in web.config

Powershell: XPath cannot select when element has "xmlns" tag?

https://mrlynchbi.wordpress.com/2014/04/02/powershell-and-xml-with-namespaces

https://learn.microsoft.com/en-us/dotnet/standard/data/xml/xpath-queries-and-namespaces

注意:这绝对不是管理绑定重定向的一种推荐的标准方法,但在我的示例中,我使用第三方应用程序,该应用程序以zip更新方式提供,通过部署自动化,我根据需要覆盖默认的web.config。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64713596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档