You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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="&#9;"/>
<add key="TabValue2" value="&#09;"/>
<add key="LTValue1" value="&amp;lt;"/>
<add key="LTValue2" value="&#60;"/>
  • 删除默认的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": "&lt;",
          "LTValue2": "&lt;" 
      }
      
    • 发布目录的web.config被篡改:
      <add key="TabValue1" value=" " />
      <add key="TabValue2" value=" " />
      <add key="LTValue1" value="&amp;lt;" />
      <add key="LTValue2" value="&amp;lt;" />
      

解决方法

方法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[&#9;]]>"/>
<add key="TabValue2" value="<![CDATA[&#09;]]>"/>

注意:读取配置时需手动移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:24:51