【问题标题】:How to use xdt-transform when the Web.config element already contains a different xmlns当 Web.config 元素已经包含不同的 xmlns 时如何使用 xdt-transform
【发布时间】:2026-02-11 16:55:01
【问题描述】:

使用 Visual Studio Web.Config 转换,我想在 Web.Debug.Config 中包含以下行:<add source="*.amazonaws.com" />

这是我的 Web.config

<configuration>
  <!--
    -- More config here
  -->
  <nwebsec>
    <httpHeaderSecurityModule xmlns="http://nwebsec.com/HttpHeaderSecurityModuleConfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="NWebsecConfig/HttpHeaderSecurityModuleConfig.xsd">
      <securityHttpHeaders>
        <content-Security-Policy enabled="true">
          <default-src none="true" />
          <script-src self="true" unsafeEval="true">
            <add source="https://cdnjs.cloudflare.com"/>
          </script-src>
          <style-src unsafeInline="true" self="true">
            <add source="https://cdnjs.cloudflare.com"/>
          </style-src>
          <img-src self="true">
            <add source="data:" />
            <add source="*.w3.org"/>
            <!-- ******** I want to insert new source here for Dev ******** -->
          </img-src>
          <object-src none="true" />
          <media-src none="true" />
          <frame-ancestors none="true" />
          <report-uri enableBuiltinHandler="true"/>
        </content-Security-Policy>
      </securityHttpHeaders>
    </httpHeaderSecurityModule>
  </nwebsec>
</configuration>

我已经完成了 Web.Debug.config 中here 的建议:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web></system.web>
  <nwebsec>
    <httpHeaderSecurityModule> <!-- I have remove xmlns=... from this element -->
      <securityHttpHeaders>
        <content-Security-Policy enabled="true">
          <img-src self="true" xdt:Transform="Remove" />
          <img-src self="true" xdt:Transform="InsertIfMissing">
            <add source="data:" />
            <add source="*.w3.org"/>
            <add source="*.amazonaws.com" />
          </connect-src>
        </content-Security-Policy>
      </securityHttpHeaders>
    </httpHeaderSecurityModule>
  </nwebsec>
</configuration>

但是没有添加新行,怎么办?

我认为这是因为httpHeaderSecurityModule 具有xmlns 属性但不知道如何解决此问题?

请注意,我已从转换文件中的 httpHeaderSecurityModule 中删除了 xmlns=...,如果我包含命名空间,则会收到以下语法错误:

“http://schemas.microsoft.com/XML-Document-Transform:Transform” 属性未声明

【问题讨论】:

    标签: asp.net visual-studio visual-studio-2019 web-config-transform xdt-transform


    【解决方案1】:

    我不确定是否有更好的解决方案,但根据MS documentation,我无法在httpHeaderSecurityModule(具有xmlns=...)元素内进行转换:

    转换文件的根元素必须指定 开始标记中的 XML-Document-Transform 命名空间

    我可以进行此转换的唯一方法是替换具有xmlns 的元素上方的所有内容,即

      <nwebsec xdt:Transform="Remove" />
      <nwebsec xdt:Transform="InsertIfMissing">
        <httpHeaderSecurityModule xmlns="http://nwebsec.com/HttpHeaderSecurityModuleConfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="NWebsecConfig/HttpHeaderSecurityModuleConfig.xsd">
          <securityHttpHeaders>
            <content-Security-Policy enabled="true">
              <default-src none="true" />
              <script-src self="true" unsafeEval="true">
                <add source="https://cdnjs.cloudflare.com"/>
              </script-src>
              <style-src unsafeInline="true" self="true">
                <add source="https://cdnjs.cloudflare.com"/>
              </style-src>
              <img-src self="true">
                <add source="data:" />
                <add source="*.w3.org"/>
                <!-- ******** I want to insert new source here for Dev ******** -->
              </img-src>
              <object-src none="true" />
              <media-src none="true" />
              <frame-ancestors none="true" />
              <report-uri enableBuiltinHandler="true"/>
            </content-Security-Policy>
          </securityHttpHeaders>
        </httpHeaderSecurityModule>
      </nwebsec>
    

    【讨论】:

      最近更新 更多