ASP.NET Core 3.1中ConfigurationManager读取Web.Config连接字符串返回null
问题根因
ASP.NET Core 3.1 不采用传统.NET Framework的Web.config作为默认配置载体,你安装的6.0版本System.Configuration兼容包,默认读取的配置文件是程序运行目录下与入口程序集同名的[入口程序集名].dll.config文件,不会主动识别项目中手动添加的Web.config。
同时你手动添加的Web.config默认不会被SDK复制到输出目录,也不会被重命名为兼容包可识别的文件名,因此ConfigurationManager.ConnectionStrings["Test"]找不到对应配置节点,返回null触发空引用异常。
解决方案
你可以根据自己的代码场景二选一:
方案1:兼容旧代码,继续使用ConfigurationManager API
- 把项目根目录下的
Web.config重命名为App.config,保留原有配置内容不变:
<configuration> <connectionStrings> <add name="Test" connectionString="MyConnString"/> </connectionStrings> </configuration>
- 右键
App.config打开属性面板,将「复制到输出目录」设置为如果较新则复制,也可以直接在.csproj项目文件中添加如下配置实现同样效果:
<ItemGroup> <None Update="App.config"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
- 重新生成项目即可。编译时SDK会自动将
App.config转换为兼容包可识别的[程序集名].dll.config输出到运行目录,原有读取代码不需要修改就能正常获取连接字符串。
方案2:使用ASP.NET Core原生配置体系(官方推荐)
这种方式不需要依赖兼容包,是ASP.NET Core的标准用法,稳定性更好:
- 移除你手动添加的
Web.config和安装的System.Configuration相关兼容包,直接在项目默认的appsettings.json中添加连接字符串配置:
{ "ConnectionStrings": { "Test": "MyConnString" } }
- 放弃使用
ConfigurationManager,通过依赖注入获取IConfiguration实例读取配置:
// 可在Controller、服务类、Startup/Program.cs中通过依赖注入拿到IConfiguration实例 string connectionString = configuration.GetConnectionString("Test");
ASP.NET Core启动时会自动加载appsettings.json的内容,不需要手动配置文件复制规则,不会出现找不到配置的问题。
内容的提问来源于stack exchange,提问作者tournageCoding
相关产品推荐
相关产品推荐

