使用NpgsqlConnection时遇SocketException未知错误求助
问题概述
使用NpgsqlConnection连接Docker部署的PostgreSQL时触发System.Net.Sockets.SocketException (10107): Unknown error (0x277b),同一Windows 10机器用DBeaver可正常访问,已尝试SSL Mode=Disable、Pooling=False但无效。
错误触发代码:
NpgsqlConnection Conn = new NpgsqlConnection("Host=192.168.50.240;Port=5432;Username=postgres;Password=*******;Database=postgres;"); Conn.Open();
完整调用栈:
System.Net.Sockets.SocketException (10107): Unknown error (0x277b)
at Interop.Winsock.g__Initialize|55_0()
at System.Net.Sockets.SocketPal.CreateSocket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType, SafeSocketHandle& socket)
at System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
at Npgsql.Internal.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
at Npgsql.Internal.NpgsqlConnector.RawOpen(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
at Npgsql.Internal.NpgsqlConnector.g__OpenCore|215_1(NpgsqlConnector conn, SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
at Npgsql.Internal.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.PoolingDataSource.OpenNewConnector(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.PoolingDataSource.g__RentAsync|28_0(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlConnection.g__OpenAsync|45_0(Boolean async, CancellationToken cancellationToken)
at Npgsql.NpgsqlConnection.Open()
解决方案
该错误本质是Windows Winsock组件初始化失败导致,结合场景按以下步骤排查:
重置Winsock组件
以管理员身份打开命令提示符,执行:netsh winsock reset执行完成后重启电脑,这是修复Windows Socket底层问题的常用方法。
强制使用IPv4连接
在连接字符串中添加AddressFamily=InterNetwork,强制Npgsql使用IPv4协议,避免IPv6配置异常引发的初始化错误:var connString = "Host=192.168.50.240;Port=5432;Username=postgres;Password=*******;Database=postgres;AddressFamily=InterNetwork;"; NpgsqlConnection Conn = new NpgsqlConnection(connString); Conn.Open();匹配.NET运行时与Npgsql版本
确保Npgsql版本和项目.NET运行时兼容:- Npgsql 7.x+ 需搭配.NET 6及以上版本
- 若项目基于.NET Framework,需使用Npgsql 4.x或对应兼容版本
通过NuGet包管理器调整Npgsql版本至匹配状态。
排查防火墙/安全软件拦截
临时关闭Windows防火墙或第三方安全软件,测试连接是否恢复。若正常,为你的.NET程序添加网络访问允许规则,避免后续被拦截。修复系统核心文件
若Winsock重置无效,执行系统文件修复命令:sfc /scannow若SFC无法修复,再执行DISM命令:
DISM /Online /Cleanup-Image /RestoreHealth验证PostgreSQL容器监听配置
进入Docker容器,检查postgresql.conf中的listen_addresses是否为*,确保PostgreSQL监听所有网络接口:docker exec -it <容器ID> bash cat /var/lib/postgresql/data/postgresql.conf | grep listen_addresses若配置为
localhost,修改为*后重启容器。
内容的提问来源于stack exchange,提问作者katorian

