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

.NET Core应用无法连接远程服务器上的Postgres Docker容器

解决.NET Core连接PostgreSQL Docker镜像的错误

核心问题

你误用了SQL Server的连接字符串格式和驱动来连接PostgreSQL,这是所有错误的根源:

  • .NET端的“预登录握手”错误是SQL Server驱动的专属报错,PostgreSQL不存在这个概念;
  • 服务器日志的invalid length of startup packet,是因为SQL Server驱动发送的数据包格式和PostgreSQL不兼容,被Postgres拒绝。

修复步骤

1. 替换为PostgreSQL的EF Core驱动

卸载项目中SQL Server相关的EF包,安装PostgreSQL专属的EF Core驱动:

# 卸载SQL Server EF包(若已安装)
Uninstall-Package Microsoft.EntityFrameworkCore.SqlServer
# 安装PostgreSQL EF Core驱动
Install-Package Npgsql.EntityFrameworkCore.PostgreSQL

2. 修改连接字符串为PostgreSQL格式

PostgreSQL的连接字符串关键字与SQL Server不同,替换你的连接字符串为:

Host=<server-IP-address>;Port=5432;Database=<dbname>;Username=postgres;Password=<password>;Timeout=30;Encrypt=False;Trust Server Certificate=True

注意:PostgreSQL用Host/Username,而非SQL Server的Server/User ID;MultipleActiveResultSets是SQL Server特性,PostgreSQL不需要。

3. 修正EF Core服务配置

在Program.cs(或Startup.cs)中,确保使用PostgreSQL的EF Core扩展方法:

// 替换原来的UseSqlServer为UseNpgsql
builder.Services.AddDbContext<YourDbContext>(options =>
    options.UseNpgsql(builder.Configuration.GetConnectionString("YourConnectionStringName")));

4. 重新执行迁移

完成上述修改后,重新运行迁移命令:

update-database

额外说明

  • 你能用pgAdmin和终端连接,是因为它们使用PostgreSQL原生客户端,发送的是Postgres兼容的数据包;
  • SQL Server Management Studio(SSMS)是专门用于SQL Server的工具,无法连接PostgreSQL,属于正常现象,不要用SSMS测试Postgres连接。

内容的提问来源于stack exchange,提问作者Samson Sim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:42:23