有没有办法使用转换“插入”新的部分到Web.Config?

时间:2014-05-17 09:45:17

标签: asp.net xslt web-config-transform xdt-transform

在我的Web.Config中,我有以下内容

  <system.webServer>

    <modules>
       **some code**
    </modules>
    <handlers>
       **some code**    
    </handlers>

  </system.webServer>

如何对其进行转换,以便将“安全性”的新子节点注入“system.webServer”?到目前为止,我尝试和搜索的所有内容都失败了。

我想要的是如下所示:

  <system.webServer>

    <modules>
       **some code**
    </modules>
    <handlers>
       **some code**    
    </handlers>

    <security>
      <ipSecurity allowUnlisted="false" denyAction="NotFound">
        <add allowed="true" ipAddress="10.148.176.10" />
      </ipSecurity>
    </security>

  </system.webServer>

2 个答案:

答案 0 :(得分:32)

找到有效的解决方案。在我的Web.Azure.Config文件中,我必须添加以下内容:

  <system.webServer>
    <security xdt:Transform="Insert">
      <ipSecurity allowUnlisted="false" denyAction="NotFound">
        <add allowed="true" ipAddress="10.148.176.10" />
      </ipSecurity>
    </security>
  </system.webServer>

我在发布问题之前尝试了这个,但由于Web.Config的另一部分出现了拼写错误,这是错误的。

答案 1 :(得分:0)

似乎部署的最佳解决方案是在Web.Azure.Config中指定,如您在答案中指定的那样。

只是为了好玩,发布这个XSLT解决方案,您也可以使用它来添加带有IP地址的<security>元素(如果它不存在),或者稍后调用以添加其他条目。执行时在ipAddress参数中设置IP地址。如果未指定ipAddress,则不执行任何操作。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:param name="ipAddress"/>

   <xsl:template match="@*|node()">
       <xsl:copy>
           <xsl:apply-templates select="@*|node()"/>
       </xsl:copy>
   </xsl:template>

    <!--Create security/ipSecurity with specified IP address, 
        if specified in param-->
    <xsl:template match="system.webServer[not(security)]">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <xsl:if test="$ipAddress">
                <security>
                    <ipSecurity allowUnlisted="false" denyAction="NotFound">
                        <add allowed="true" ipAddress="{$ipAddress}" />
                    </ipSecurity>
                </security>
            </xsl:if>
        </xsl:copy>      
    </xsl:template>

    <!--Add an allowed IP address to existing security/ipSecurity entry, 
        if IP address is specified in param -->
    <xsl:template match="security/ipSecurity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <xsl:if test="$ipAddress">
                <add allowed="true" ipAddress="{$ipAddress}" />
            </xsl:if>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>