Как создать соединение из службы .NET с удаленным сервером PostgreSQL

Я не могу подключиться к удаленному серверу PostgreSQL из кода С# .NET, используя некоторую строку подключения. (Моя строка подключения содержит основную информацию, такую ​​как адрес хоста, порт, имя пользователя, пароль, имя базы данных).

Я могу подключиться к серверу PostgreSQL из PGAdmin 4 с помощью SSH-туннеля, у меня есть удаленный вход (имя пользователя и пароль), порт (22) и закрытый ключ RSA.

Моя строка подключения: Server=HOST_ADDRESS;Port=HOST_PORT;User Id=POSTGRES_USERNAME;Password=POSTGRES_PASSWORD;Database=POSTGRES_DATABASE_NAME;

Примечание. Я использую Npgsql .NET Assembly.

И ошибка, которую я получаю:

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()

person Siddhesh Kulkarni    schedule 11.02.2019    source источник
comment
См. строку подключения. connectionstrings.com/postgresql   -  person jdweng    schedule 11.02.2019
comment
@jdweng Моя строка подключения выглядит нормально, как указано в вашей ссылке. Обратите внимание, что я могу подключиться к серверу PostgreSQL на моем локальном компьютере, но я получаю сообщение об ошибке, когда пытаюсь подключиться к удаленному серверу на компьютере с Linux.   -  person Siddhesh Kulkarni    schedule 11.02.2019
comment
Я предполагаю, что приложение PGAdmin 4 находится на том же компьютере, что и ваше приложение, которое выходит из строя и подключается к тому же удаленному серверу. Затем я бы использовал сниффер, такой как wireshark или fiddler, и сравнил бы работающий PGAdmin 4 с вашим приложением С#, которое терпит неудачу. Обычно это происходит из-за того, что заголовок http отличается, и вам нужно сделать так, чтобы ваше приложение выглядело как работающий PGAdmin 4. Я также предполагаю, что вы просматривали строки подключения с параметром sslmode=require. Когда вы используете сниффер, посмотрите, какая строка подключения является пользователем с PGAdmin 4.   -  person jdweng    schedule 11.02.2019


Ответы (2)


Проверьте файл pg_hba.conf в каталоге данных. Это указывает, кто может и не может подключиться к вашей базе данных. Конфигурация по умолчанию довольно ограничительна (ошибки на стороне осторожности).

Если вы доверяете всем машинам в вашей сети, при условии, что у них есть идентификатор пользователя/пароль (например, рабочая среда с брандмауэром), вы можете добавить в файл что-то вроде этого:

host     all     all     0.0.0.0/0       md5

Если нет, проверьте документы или даже сам файл хорошо объясняет различные параметры.

person Hambone    schedule 12.02.2019
comment
Большое спасибо! это была проблема все время :) - person Siddhesh Kulkarni; 12.02.2019

Мне кажется, что на машине, к которой вы пытаетесь подключиться, может быть заблокирован порт, пожалуйста, проверьте, так ли это. если это не так, вы можете проверить свое строковое соединение, следуя синтаксису, указанному в документации Npsql (https://www.npgsql.org/doc/index.html), он выглядит следующим образом:

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

Здесь вы можете найти параметры строки подключения.

person Thecoreman    schedule 11.02.2019
comment
Позвольте мне посмотреть настройки порта на удаленном сервере и вернуться к вам - person Siddhesh Kulkarni; 11.02.2019