Web.config元素含自定义xmlns时如何正确使用xdt-transform?
Web.Config Transforms 带自定义命名空间节点插入解决方案
问题根因
你遇到的报错和插入失效问题源于两个命名空间的冲突:原httpHeaderSecurityModule节点的自定义默认命名空间,和Web转换专用的XML-Document-Transform命名空间作用域重叠,导致要么属性无法识别,要么节点匹配失败。
解决步骤
转换文件根节点同时声明两套命名空间
打开Web.Debug.Config,在根<configuration>节点上同时声明微软转换命名空间、以及原配置中httpHeaderSecurityModule的自定义命名空间(自定义命名空间的URI直接从原Web.config对应节点的xmlns属性复制即可,这里以示例URIhttp://schemas.custom.com/securityConfig演示,替换成你实际的URI):
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xmlns:sec="http://schemas.custom.com/securityConfig"> <!-- 其他原有转换配置 --> </configuration>
这里我们给自定义命名空间加了sec别名,避免默认命名空间冲突。
2. ### 带命名空间别名编写插入规则
在转换节点前加上自定义命名空间的别名,确保能匹配到原配置中带自定义命名空间的节点,插入规则写法如下:
<sec:httpHeaderSecurityModule> <sec:contentSecurityPolicy> <sec:img-src> <add source="*.amazonaws.com" xdt:Transform="Insert" /> </sec:img-src> </sec:contentSecurityPolicy> </sec:httpHeaderSecurityModule>
额外说明
如果需要精准控制插入位置,可以给add节点补充xdt:Locator属性匹配参考节点,比如要插入到所有现有img-src子项的最前面,就把规则改成:
<add source="*.amazonaws.com" xdt:Transform="InsertBefore(/sec:httpHeaderSecurityModule/sec:contentSecurityPolicy/sec:img-src/sec:add[last()])" />
内容的提问来源于stack exchange,提问作者Hooman Bahreini
相关产品推荐
相关产品推荐

