Web.config 必须位于应用根目录才能生效,子目录可放独立文件但仅影响自身及子目录;.NET Core/5+ 中仅 IIS 集成场景下保留用于 aspNetCore 模块配置。

Web.config 是 ASP.NET 应用程序的 XML 格式配置文件,位于网站根目录或子目录中,用于声明式地控制运行时行为、连接字符串、身份验证、模块加载、错误处理等。它不参与编译,但被 IIS 和 .NET 运行时在启动和请求过程中主动读取。
Web.config 文件必须放在哪里才能生效
ASP.NET(包括 .NET Framework 和 .NET Core/5+ 的兼容模式)要求 Web.config 位于应用的根目录(即 IIS 站点物理路径起点),否则会被忽略。子目录可放独立 Web.config,但只影响该目录及子目录下的请求,且会继承上级配置(部分节如 <system.web></system.web> 不支持叠加,后加载的会覆盖)。
- IIS 托管:必须与
Global.asax或应用入口(如web.config同级的Default.aspx)在同一级 - 本地开发(IIS Express / Visual Studio):项目属性 → “Web” 选项卡 → “Project Url” 对应的物理路径根下
- .NET Core/5+ 中已弃用
Web.config主配置功能,仅在 IIS 集成场景下保留用于aspNetCore模块配置,其余用appsettings.json
修改 connectionStrings 节时常见错误
连接字符串写错最直接的表现是 System.Data.SqlClient.SqlException: A network-related or instance-specific error... 或空连接对象。问题常出在拼写、转义、环境适配上。
-
name属性必须与代码中ConfigurationManager.ConnectionStrings["xxx"]的键名完全一致(区分大小写) - SQL Server 实例名若含反斜杠(如
.\SQLEXPRESS),需确保在 XML 中未被误转义;推荐用\或直接写为localhost\SQLEXPRESS - 使用集成安全(
Integrated Security=true)时,IIS 应用池标识必须有数据库访问权限;改用 SQL 账号则需开启混合认证并确认登录名未被锁定 - 发布到服务器时,
Web.config中的明文密码属于高危行为,应配合aspnet_regiis.exe -pef加密connectionStrings节
system.webServer 模块配置导致 500.19 错误
IIS 报错 HTTP Error 500.19 - Internal Server Error,详细信息里出现“无法识别的属性”或“此配置节已被锁定”,基本是 <system.webserver></system.webserver> 下配置了仅适用于特定 IIS 版本或未安装模块的项。
-
<modules runallmanagedmodulesforallrequests="true"></modules>在 IIS 7.5+ 可用,但会降低静态文件性能;.NET 4.5+ 推荐改用<add name="MyModule" type="..." precondition="managedHandler"></add> -
<httpprotocol></httpprotocol>中添加自定义 Header(如X-Frame-Options)没问题,但若写成<customheaders></customheaders>而不是<customheaders><add ...></add></customheaders>,XML 解析失败直接 500.19 - 启用压缩(
<urlcompression dostaticcompression="true"></urlcompression>)前,需确认 IIS 中“静态内容压缩”功能已安装(Windows 功能 → IIS → 性能功能)
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Content-Type-Options" value="nosniff" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>调试 Web.config 加载是否成功
没有日志输出、也不报错,但配置没起作用?最有效的验证方式不是看代码,而是让 IIS 显式吐出当前合并后的配置。
- 命令行执行:
%windir%\system32\inetsrv\appcmd list config "Default Web Site/" -section:system.webServer/handlers(替换站点名和 section) - 在
Global.asax.cs的Application_Start中加一行:System.Diagnostics.Debug.WriteLine(ConfigurationManager.AppSettings["MyKey"]);,然后查看 Output 窗口(仅开发环境) - 临时把
Web.config改成非法 XML(比如删一个>),如果访问直接 500.19 而非 500,说明文件确实被加载了 - 注意:IIS 缓存配置,修改后不一定立即生效;可执行
iisreset /noforce或回收对应应用池
真正容易被忽略的是配置节的继承规则和锁机制——Web.config 不是“越靠下越优先”,而是按 IIS 配置层级(服务器 → 站点 → 应用 → 目录)逐级合并,某些节默认被 allowOverride="false" 锁定,强行写会导致 500.19。动手前先查 MSDN 对应节的“Configuration Section Information”说明。

















