Visual Studio发布时错误修改web.config编码值问题
Visual Studio发布时错误修改web.config制表符编码值的问题及解决方法
问题说明
使用VS 17.12.4(基于.NET 4.8.09032)发布ASP.NET Web API项目时,发现发布流程会错误修改web.config中的编码值:
- 构建过程不会改动原文件,但发布时会把制表符的实体编码
	和	替换成空格,导致配置项丢失制表符 - 小于号的实体编码
<和<会被统一转为<,虽不影响功能,但制表符的错误替换直接破坏业务需求 - 本地运行时bin目录下的web.config与原文件完全一致,仅发布目录的文件被篡改
复现步骤
- 创建新的ASP.NET Web Application(.NET Framework),选择Web API模板,保留默认设置
- 在web.config的
<appSettings>节点中添加以下配置:
<add key="TabValue1" value="	"/> <add key="TabValue2" value="	"/> <add key="LTValue1" value="&lt;"/> <add key="LTValue2" value="<"/>
- 删除默认的Values控制器
- 创建新控制器并添加代码:
[HttpGet] public HttpResponseMessage Get() => Request.CreateResponse(HttpStatusCode.OK, new { TabValue1 = ConfigurationManager.AppSettings["TabValue1"], TabValue2 = ConfigurationManager.AppSettings["TabValue2"], LTValue1 = ConfigurationManager.AppSettings["LTValue1"], LTValue2 = ConfigurationManager.AppSettings["LTValue2"] });
- 创建使用Debug配置的文件夹发布配置文件
- 发布API后对比文件:
- 本地bin目录的web.config与原文件一致,接口返回预期结果:
{ "TabValue1": "\t", "TabValue2": "\t", "LTValue1": "<", "LTValue2": "<" } - 发布目录的web.config被篡改:
<add key="TabValue1" value=" " /> <add key="TabValue2" value=" " /> <add key="LTValue1" value="&lt;" /> <add key="LTValue2" value="&lt;" />
- 本地bin目录的web.config与原文件一致,接口返回预期结果:
解决方法
方法1:修改发布配置禁用web.config处理
打开发布配置文件(.pubxml,位于Properties/PublishProfiles目录下),添加以下配置,阻止发布过程修改web.config:
<PropertyGroup> <WebConfigTransformEnabled>False</WebConfigTransformEnabled> <AutoParameterizationWebConfigConnectionStrings>False</AutoParameterizationWebConfigConnectionStrings> <PreserveWhitespaceInWebConfig>True</PreserveWhitespaceInWebConfig> </PropertyGroup>
其中PreserveWhitespaceInWebConfig设为True可保留制表符实体,另外两项配置避免自动转换连接字符串或应用其他web.config转换规则。
方法2:用CDATA包裹制表符值
如果方法1无效,可将需要保留的制表符值放在CDATA块中,避免发布时被解析替换:
<add key="TabValue1" value="<![CDATA[	]]>"/> <add key="TabValue2" value="<![CDATA[	]]>"/>
注意:读取配置时需手动移除CDATA标记,示例代码:
var rawValue = ConfigurationManager.AppSettings["TabValue1"]; var tabValue = rawValue.Replace("<![CDATA[", "").Replace("]]>", "");
方法3:直接使用制表符字符
若web.config采用UTF-8编码,可直接在value中输入制表符(按下Tab键),而非使用实体编码:
<add key="TabValue1" value=" "/> <!-- 此处为直接输入的制表符 -->
这种方式发布时不会被替换,但编辑web.config时需注意不要意外删除制表符。
内容的提问来源于stack exchange,提问作者No No
相关产品推荐
相关产品推荐

