.NET 6项目迁移PostgreSQL遇SocketException错误排查求助
.NET 6迁移PostgreSQL遇SocketException排查方案
错误信息
System.Net.Sockets.SocketException HResult=0x80004005 Message=The requested name is valid, but no data of the requested type was found. Source=Npgsql StackTrace: ... at Crogics.ERP.Web.Models.InitialDataSeeder.<<AddAdministrator>b__6_0>d.MoveNext() in C:\Users\Dell\Desktop\rojics\CrogicsERPLite\Source\Crogics.ERP.Web\Models\InitialDataSeeder.cs:line 47
排查方向及解决方法
1. 连接字符串与DbContext配置隐性问题
- 可能原因:原项目存在多配置源(如环境变量、用户机密),实际生效的连接字符串仍指向SQL Server;或PostgreSQL连接字符串格式错误(如主机名别名解析失败、未指定非默认端口);DbContext配置残留SQL Server驱动。
- 解决方法:
- 检查所有配置源的连接字符串,确保
DefaultConnection为PostgreSQL格式:Host=localhost;Port=5432;Database=yourdb;Username=postgres;Password=yourpwd - 替换主机名为
127.0.0.1测试DNS解析问题 - 确认
CrogicsERPContext服务注册仅使用UseNpgsql,无UseSqlServer残留:services.AddDbContext<CrogicsERPContext>(opt => opt.UseNpgsql(Configuration.GetConnectionString("DefaultConnection")));
- 检查所有配置源的连接字符串,确保
2. NuGet包版本不兼容
- 可能原因:原项目
Npgsql或Npgsql.EntityFrameworkCore.PostgreSQL版本与.NET 6不匹配,存在依赖冲突;复刻项目使用了兼容版本。 - 解决方法:
- 卸载原项目中
Microsoft.EntityFrameworkCore.SqlServer包(若存在) - 安装适配.NET 6的稳定版本:
Npgsql(6.x系列)、Npgsql.EntityFrameworkCore.PostgreSQL(6.x系列)
- 卸载原项目中
3. 同步异步混用导致线程上下文异常
- 可能原因:
InitialDataSeeder中用Task.Run(...).GetAwaiter().GetResult()阻塞异步代码,在ASP.NET Core启动阶段破坏线程上下文,导致数据库连接初始化失败;复刻项目启动环境未触发该问题。 - 解决方法:将Seeder改为纯异步实现:
- 修改接口与实现类:
public interface IInitialDataSeeder { Task InitializeAsync(); } public class InitialDataSeeder : IInitialDataSeeder { // 构造函数不变 public async Task InitializeAsync() { await AddAdministratorAsync(); await _db.SaveChangesAsync(); await AddRolesAsync(); } private async Task AddAdministratorAsync() { // 移除Task.Run,直接执行异步逻辑 var supperAdminRole = new ApplicationRole(Roles.SuperAdmin); var supperAdminRoleInDb = await _roleManager.FindByNameAsync(Roles.SuperAdmin); // 后续所有异步操作均使用await,避免阻塞 } private async Task AddRolesAsync() { // 同理改为纯异步实现 } } - 在Startup中异步调用初始化:
public async Task ConfigureAsync(IApplicationBuilder app, IWebHostEnvironment env, IInitialDataSeeder seeder) { // 其他中间件配置 await seeder.InitializeAsync(); }
- 修改接口与实现类:
4. 网络与PostgreSQL服务配置问题
- 可能原因:PostgreSQL未监听指定IP,或防火墙/
pg_hba.conf拒绝连接;DNS解析时仅返回IPv6地址,但PostgreSQL未配置IPv6监听。 - 解决方法:
- 检查
postgresql.conf中listen_addresses = '*'(允许所有IP访问) - 检查
pg_hba.conf添加本地访问规则:host all all 127.0.0.1/32 scram-sha-256 - 重启PostgreSQL服务后测试连接
- 检查
5. DbContext生命周期配置错误
- 可能原因:原项目DbContext使用
Singleton生命周期,导致连接池异常;复刻项目使用默认Scoped生命周期。 - 解决方法:确保DbContext注册为
Scoped(ASP.NET Core默认配置),避免单例模式。
内容的提问来源于stack exchange,提问作者Waleed Umer
相关产品推荐
相关产品推荐

