【问题标题】:How to create a connection from .NET Service to Remote PostgreSQL server如何创建从 .NET 服务到远程 PostgreSQL 服务器的连接
【发布时间】:2019-02-11 12:27:17
【问题描述】:

我无法使用某些连接字符串从 C# .NET 代码连接到远程 PostgreSQL 服务器。 (我的连接字符串包含主机地址、端口、用户名、密码、数据库名称等基本信息)。

我可以使用 SSH 隧道从 PGAdmin 4 连接到 PostgreSQL 服务器, 我有远程登录(用户名和密码)、端口 (22) 和 RSA 私钥。

我的连接字符串: Server=HOST_ADDRESS;Port=HOST_PORT;User Id=POSTGRES_USERNAME;Password=POSTGRES_PASSWORD;Database=POSTGRES_DATABASE_NAME;

注意:我正在使用Npgsql .NET 程序集

我得到的错误是:

No connection could be made because the target machine actively refused it
 Npgsql.NpgsqlConnector.Connect(NpgsqlTimeout timeout)
   at Npgsql.NpgsqlConnector.<RawOpen>d__153.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Npgsql.NpgsqlConnector.<Open>d__149.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Npgsql.ConnectorPool.<AllocateLong>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Npgsql.NpgsqlConnection.<>c__DisplayClass32_0.<<Open>g__OpenLong|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Npgsql.NpgsqlConnection.Open()

【问题讨论】:

  • 查看连接字符串。 connectionstrings.com/postgresql
  • @jdweng 我的连接字符串看起来很好,就像您在链接中给出的那样,请注意,我可以连接到本地的 PostgreSQL 服务器,但是当我尝试连接远程服务器时出现错误Linux 机器。
  • 我假设 PGAdmin 4 应用程序与您的应用程序在同一台机器上失败并连接到同一个远程服务器。然后我会使用像wireshark或fiddler这样的嗅探器,并将工作的PGAdmin 4与你失败的c#应用程序进行比较。通常这是由于 http 标头不同,您必须使您的应用程序看起来像工作中的 PGAdmin 4。我还假设您查看了 sslmode=require 选项的连接字符串。当您使用嗅探器时,使用 PGAdmin 4 查看用户的连接字符串。

标签: c# postgresql ssh connection remote-connection


【解决方案1】:

检查数据目录中的 pg_hba.conf 文件。这表明谁可以和不能连接到您的数据库。默认配置是相当严格的(我认为是谨慎的错误)。

如果您信任网络中的所有机器,只要它们有用户 ID/密码(想想有防火墙的工作环境),您可以在文件中添加类似这样的内容:

host     all     all     0.0.0.0/0       md5

如果没有,请检查文档,甚至文件本身都可以很好地解释各种选项。

【讨论】:

  • 非常感谢!这一直是问题:)
【解决方案2】:

在我看来,您尝试连接的机器的端口可能已阻塞,请检查是否是这种情况。如果不是,那么您可以按照 Npsql 文档 (https://www.npgsql.org/doc/index.html) 上的语法检查您的字符串连接,如下所示:

var connString = "Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase";

您可以在这里找到connection string parameters

【讨论】:

  • 让我看看远程服务器上的端口设置并回复你
猜你喜欢
  • 1970-01-01
  • 2018-09-17
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多