You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NpgsqlConnection时遇SocketException未知错误求助

解决NpgsqlConnection连接PostgreSQL时出现的SocketException (10107: 0x277b)错误

问题概述

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:45:37