在.NET生态中,配置文件是应用程序运行时读取参数、连接字符串与行为开关的核心载体。最常见的两种XML配置文件是Web.config与App.config,它们表面写法相似,却因宿主环境不同而在加载机制、生效方式和部署形态上有着本质区别。理解这些差异,是写好.NET程序配置层的前提。

一、基本定位与宿主环境差异
App.config主要面向客户端程序、控制台应用、Windows服务这类桌面或独立进程场景。在Visual Studio中,你为项目添加的App.config文件,在编译后并不会原样输出,而是被重命名为“程序名.exe.config”放置在输出目录。运行时,CLR通过应用程序域的配置系统读取该文件,且读取动作多发生在进程启动初期。
Web.config则专属于Web应用程序,运行在IIS或自托管(如Kestrel配合ASP.NET Core早期体系)的Web服务器下。它存放在网站根目录或子目录中,由ASP.NET运行时在每次请求处理管道中按需读取。由于Web应用是请求驱动,配置修改后通常无需重启站点即可被后续请求感知,这正是两者最直观的体验差别。
二、文件生成与部署形态对比
我们通过一段典型的App.config来看其原始结构:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="LogPath" value="C:logsapp" />
<appSettings>
<connectionStrings>
<add name="MainDb" connectionString="Server=.;Database=test;Integrated Security=true" />
<connectionStrings>
</configuration>
编译后,上述文件会变成MyApp.exe.config。如果用户在部署后直接编辑App.config而不是exe.config,程序完全不会理会。这是很多初学者踩过的坑。相比之下,Web.config在开发期和部署期文件名保持不变,直接位于站点物理路径下。
以下表格总结了二者在部署上的关键不同:
| 对比维度 | App.config | Web.config |
|---|---|---|
| 编译后名称 | 程序名.exe.config | 保持Web.config |
| 修改后是否需重启 | 通常需重启进程 | 一般自动重加载 |
| 适用项目模板 | 控制台、WinForm、WPF | ASP.NET WebForms、MVC |
三、配置继承与目录层级
Web.config拥有强大的目录继承机制。在IIS中,机器级有根Web.config(在.NET Framework目录下),站点级有网站根Web.config,子文件夹还可以有自己的Web.config,子级会合并或覆盖父级设置。例如,在子目录禁止某种HTTP处理程序,只需该目录下放一个简短Web.config即可。
而App.config不存在这种多层继承。一个exe只有一个对应的exe.config,若想拆分配置,往往要通过configSource属性把某一段指向外部文件,或自行写代码读取额外XML。示例如下:
<configuration> <connectionStrings configSource="connections.config" /> </configuration>
这种方式的灵活性不如Web.config的层级覆盖,但胜在简单直接,适合客户端程序避免单文件过大。
四、加密与安全性处理
对于包含密码的连接串,ASP.NET提供了aspnet_regiis工具对Web.config段落加密,且支持基于服务器的RSA密钥容器,解密由运行时自动完成。App.config也可使用同样的ProtectedConfigurationProvider,但命令行工具针对的是Web站点,客户端常需自己调用API加密,部署到用户机器后密钥管理更麻烦。
代码层面,无论哪种配置,读取方式在.NET Framework中高度一致:
using System.Configuration; string logPath = ConfigurationManager.AppSettings["LogPath"]; string conn = ConfigurationManager.ConnectionStrings["MainDb"].ConnectionString;
这段逻辑在Web和桌面项目都能跑通,区别仅在于底层文件来源不同。到了.NET Core之后,体系改为appsettings.json,但了解旧版XML配置的区别,对维护存量系统仍有价值。
五、常见误用与最佳实践
有人把Web.config里的system.web节点整段抄到App.config,结果程序启动报错,因为system.web是ASP.NET专属,桌面程序无此宿主。反过来,在Web项目里用大量appSettings而不是分层配置,也会导致网站难以按环境拆分。
建议桌面程序把易变参数放exe.config并用ConfigurationManager读写;Web程序利用Web.config的transform(如Web.Debug.config、Web.Release.config)做环境切换。清晰区分两者边界,配置管理才不易混乱。
Web_configApp_config.NET_configuration修改时间:2026-08-08 16:03:28