如何在ASP.NET Core Web API中连接DigitalOcean托管的PostgreSQL数据库
问题原因与解决方案
错误1:ArgumentException: Keyword not supported: postgresql://xxx
原因
Npgsql 默认仅支持键=值;格式的连接字符串,无法直接解析DigitalOcean给出的postgresql://开头的URI格式连接串。
解决方案
二选一即可:
- 方案1:代码层转换URI格式
读取配置后手动解析URI生成标准连接串:
var pgConnUri = new Uri(Configuration.GetConnectionString("DefaultConnection")); var pgConnBuilder = new NpgsqlConnectionStringBuilder { Host = pgConnUri.Host, Port = pgConnUri.Port, Username = pgConnUri.UserInfo.Split(':')[0], Password = pgConnUri.UserInfo.Split(':')[1], Database = pgConnUri.AbsolutePath.TrimStart('/'), SslMode = SslMode.Require }; string finalConnString = pgConnBuilder.ToString();
- 方案2:手动转为标准键值对格式写入appsettings.json
必须添加SslMode=Require参数,必须删除错误的Integrated Security=true配置(该参数仅适用于本地Windows集成认证,DigitalOcean托管PostgreSQL不支持):
{ "ConnectionStrings": { "DefaultConnection": "Server=db-trackbus-nyc3-xxxx-do-user-xxxxx-0.b.db.ondigitalocean.com;Port=xxxxx;Database=TrackBus;User Id=xxxxx_user;Password=xxxxxxxxxx;SslMode=Require;" } }
如果使用私网连接,只需要把Server字段替换为私网地址即可,其余参数不变。
错误2:PostgresException: 28000: no pg_hba.conf entry for host ... SSL off
原因
触发该错误有两个核心原因:
- 连接串未加
SslMode=Require参数,DigitalOcean托管PostgreSQL默认强制要求SSL连接,非SSL请求会被直接拦截 - 数据库访问权限未放开:如果使用公网连接,需要先在DigitalOcean数据库控制台的可信来源配置中添加你当前服务的公网出口IP;如果使用私网连接,需要保证你的服务和数据库在同一个VPC内。
验证步骤
- 测试阶段可以临时将数据库可信来源设置为
0.0.0.0/0确认连接是否正常,验证通过后务必改回仅限你的服务IP访问 - 再次确认连接串中已删除
Integrated Security=true配置,且正确添加SslMode=Require
内容的提问来源于stack exchange,提问作者Techy Hernández
相关产品推荐
相关产品推荐

