基于Web.config中ClientName值修改requireSSL属性的技术问询
解决方案:基于ClientName的Web.config XML变换实现
默认的XML变换工具(比如SlowCheetah)不支持跨节点的条件判断逻辑,要实现你要的效果,得用XSLT变换来搞定,因为XSLT能灵活查询任意节点并根据条件修改属性。
1. 编写XSLT变换文件
创建一个名为Web.Transform.xslt的文件,内容如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 复制所有节点和属性,默认不修改 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 获取appSettings里的ClientName值 --> <xsl:variable name="clientName" select="/configuration/appSettings/add[@key='ClientName']/@value"/> <!-- 修改system.web/httpCookies的requireSSL属性 --> <xsl:template match="/configuration/system.web/httpCookies/@requireSSL"> <xsl:attribute name="requireSSL"> <xsl:choose> <xsl:when test="$clientName = 'WXYZ'">false</xsl:when> <xsl:otherwise>true</xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:template> <!-- 修改authentication/forms的requireSSL属性 --> <xsl:template match="/configuration/system.web/authentication/forms/@requireSSL"> <xsl:attribute name="requireSSL"> <xsl:choose> <xsl:when test="$clientName = 'WXYZ'">false</xsl:when> <xsl:otherwise>true</xsl:otherwise> </xsl:choose> </xsl:attribute> </xsl:template> </xsl:stylesheet>
这个XSLT会:
- 复制原Web.config的所有内容
- 读取
appSettings下ClientName的值 - 匹配到
httpCookies和forms节点的requireSSL属性时,根据ClientName的值替换为对应布尔值
2. 配置项目自动执行变换
在你的项目文件(.csproj或.vbproj)里添加以下MSBuild任务,让构建时自动执行XSLT变换:
<Target Name="TransformWebConfig" AfterTargets="Build"> <XslTransformation XslInputPath="Web.Transform.xslt" XmlInputPath="Web.config" OutputPath="$(OutputPath)\Web.config"/> </Target>
这样每次构建项目后,输出目录里的Web.config就是已经变换好的版本。
3. 验证效果
- 把
Web.config里appSettings的ClientName设为WXYZ,构建后检查httpCookies和forms的requireSSL是否为false - 把
ClientName设为ABCD或其他值,构建后检查对应属性是否为true
内容的提问来源于stack exchange,提问作者Dan7el
相关产品推荐
相关产品推荐

