C#使用Npgsql连接PostgreSQL时遇SocketException连接被强制关闭
排查Npgsql连接PostgreSQL时的“连接被远程主机强制关闭”错误
针对你遇到的SocketException: An existing connection was forcibly closed by the remote host错误,可按以下步骤逐一排查:
确认PostgreSQL服务状态
检查本地PostgreSQL服务是否运行:Windows可在「服务」列表中查找postgresql-x64-[版本号],Linux/macOS用命令pg_ctl status。若服务未启动,手动启动后重试连接。补充连接字符串的端口参数
你当前的连接字符串未显式指定端口,虽然PostgreSQL默认端口为5432,但为确保配置文件中的端口生效,建议补充端口配置:var connectionString = $"Host={cS.server};Port={cS.port};Username={cS.userID};Password={cS.password};Database={cS.database}";验证数据库及账号信息
- 确认
Postgres2数据库存在:用pgAdmin登录postgres账号,查看数据库列表。 - 测试账号密码:用psql命令
psql -U postgres -d Postgres2,输入密码admin验证是否能正常登录。
- 确认
检查端口占用与防火墙设置
- 用命令
netstat -ano | findstr :5432检查5432端口是否被其他进程占用,若有则终止占用进程或修改PostgreSQL监听端口。 - 临时关闭本地防火墙,测试是否能正常连接,排除防火墙拦截的可能。
- 用命令
调整PostgreSQL的监听与权限配置
- 打开PostgreSQL安装目录
data文件夹下的postgresql.conf,确认listen_addresses设置为localhost或*,允许本地连接。 - 打开同目录下的
pg_hba.conf,确认存在允许本地用户连接的规则,例如:host all all 127.0.0.1/32 scram-sha-256 host all all ::1/128 scram-sha-256
修改配置后需重启PostgreSQL服务。
- 打开PostgreSQL安装目录
修复代码的潜在问题
- 替换
async void为async Task,避免连接过程中的异常无法被捕获排查:async Task Start() { // 原有代码逻辑 } - 在解析配置后打印参数,确认
ConnectionString.FromJson是否正确读取了配置内容:Console.WriteLine($"Server: {cS.server}, Port: {cS.port}, DB: {cS.database}, User: {cS.userID}");
- 替换
内容的提问来源于stack exchange,提问作者Izzan
相关产品推荐
相关产品推荐

