使用Npgsql连接Heroku PostgreSQL时连接字符串主机名被替换为公网IP
问题描述
正在尝试使用npgsql NuGet包连接Heroku PostgreSQL实例,遇到了连接字符串相关问题:主机名被自动替换为本地设备的公网IP(见下方截图)。调用NpgsqlConnection的Open()方法时会抛出主机不存在的异常,而连接字符串中指定的其余参数(用户名、密码、目标数据库)均可被正确识别。
已尝试将参数名host替换为Host、Server、server,问题没有得到解决。数据库运行状态正常,使用相同的连接信息可通过DataGrip正常连接该数据库。
可行解决方案
- 调用
Open()方法前先打印NpgsqlConnection.ConnectionString的输出,确认Host参数值和预期一致,排除上层配置读取、字符串拼接逻辑错误的可能性。 - 优先使用
NpgsqlConnectionStringBuilder构造连接字符串,规避手动拼接的格式错误、不可见字符问题,Heroku PostgreSQL强制要求SSL连接,必须显式配置SSL相关参数,示例代码如下:
var connBuilder = new NpgsqlConnectionStringBuilder { Host = "你的Heroku PostgreSQL主机地址", Port = 5432, Username = "数据库用户名", Password = "数据库密码", Database = "目标数据库名", SslMode = SslMode.Require, TrustServerCertificate = true }; using var conn = new NpgsqlConnection(connBuilder.ConnectionString); conn.Open();
- 排查本地全局代理设置:若设备开启了全局代理,可临时将Heroku PostgreSQL主机地址加入代理忽略列表,Windows可在命令行执行
set NO_PROXY=你的Heroku PostgreSQL主机地址后再启动程序,Linux/macOS执行export NO_PROXY=你的Heroku PostgreSQL主机地址。 - 升级npgsql版本:若使用的是5.0以下的旧版本npgsql,升级到最新稳定版即可解决旧版本存在的特殊域名解析异常已知bug。
- 刷新本地DNS缓存:Windows执行
ipconfig /flushdns,Linux/macOS执行对应DNS缓存刷新命令后重试。
内容的提问来源于stack exchange,提问作者tzuntar
相关产品推荐
相关产品推荐

