.NET 6 Worker Service中AddDbContext用appsettings连接字符串无效怎么解决
问题排查解决方案
以下是按出现概率从高到低排列的排查方向:
- 检查Windows服务工作目录问题
这是Windows服务类项目最常见的坑:Host.CreateDefaultBuilder默认从程序当前工作目录读取配置文件,而Windows服务默认的工作目录是C:\Windows\System32,不是你的程序 exe 所在目录,自然找不到appsettings.json文件。
修复方法:在创建Host前手动将工作目录切换为程序集所在目录,代码如下:using System.Diagnostics; using System.IO; // 放在Host.CreateDefaultBuilder之前执行 var exeDir = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); Directory.SetCurrentDirectory(exeDir); using IHost host = Host.CreateDefaultBuilder(args) // 其余原有代码保持不变 - 检查
appsettings.json文件属性
右键项目中的appsettings.json,查看属性中的「复制到输出目录」选项,必须设置为如果较新则复制或者始终复制,否则编译/发布时配置文件不会被拷贝到运行目录,导致读不到配置。 - 检查配置文件结构与拼写
确认appsettings.json中的配置层级完全正确,示例结构如下:
注意不要拼写错误:比如{ "ConnectionStrings": { "DefaultConnection": "你的实际数据库连接字符串" } }ConnectionStrings漏写末尾的s、DefaultConnection名称不匹配等。 - 检查DbContext构造函数
确认你的nbiot_core_svctestContext类存在接收DbContextOptions<nbiot_core_svctestContext>参数的构造函数,并且正确调用了父类构造:
如果你的Context只保留了无参构造函数,且在无参构造中硬编码了连接逻辑,那么依赖注入传入的配置会完全失效。public nbiot_core_svctestContext(DbContextOptions<nbiot_core_svctestContext> options) : base(options) { } - 验证配置读取结果
你可以在ConfigureServices方法中加临时代码验证配置是否被正确读取:
注意这里修改了.ConfigureServices((context, services) => { // 加这行打断点查看connStr的值是否正确 var connStr = context.Configuration.GetConnectionString("DefaultConnection"); // 其余原有服务注册逻辑 })ConfigureServices的入参,新增了context参数来直接拿到配置对象,避免手动构建服务提供者的性能损耗。
内容的提问来源于stack exchange,提问作者forrestDumb
相关产品推荐
相关产品推荐

