Sql Connection отказывается подключаться при использовании Mono

Я создал простую программу для иллюстрации проблемы. У меня есть консольное приложение, которое должно подключаться к внешнему экземпляру SQL Server.

Локально я могу прекрасно подключиться к этому хосту (независимо от того, установлен ли IP-адрес или внешний URL-адрес, с которым сервер связан через DNS). Когда я копирую скомпилированную версию приложения на сервер Ubuntu с установленным Mono и запускаю приложение с помощью mono ConsoleApplication1.exe, я каждый раз получаю эту ошибку:

System.Data.SqlClient.SqlException: сервер не существует или в соединении отказано. at System.Data.SqlClient.SqlConnection.Open () ‹0x409d4e90 + 0x0053f> in :0 at ConsoleApplication1.Program.Main (System.String[] args) ‹0x409a7d50 + 0x00077> in :0 [ОШИБКА] НЕИСПРАВНОЕ НЕОБРАБОТАННОЕ ИСКЛЮЧЕНИЕ: Система .Data.SqlClient.SqlException: сервер не существует или в соединении отказано. в System.Data.SqlClient.SqlConnection.Open () ‹0x409d4e90 + 0x0053f> в :0 в ConsoleApplication1.Program.Main (System.String[] args) ‹0x409a7d50 + 0x00077> в :0

Я попытался использовать прямой IP-адрес для экземпляра SQL Server, а также внешний URL-адрес (вместо приведенного ниже), который, как я знаю, работает локально при запуске этого приложения.

Код, используемый для настройки в приложении:

App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="Test" connectionString="data source=<Host>\<Instance Name>, 1069;database=<Database Name>;user id=<User>;password=<Password>;multipleactiveresultsets=True;"/>
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
  </startup>
</configuration>

Код С#

class Program
{
    static void Main(string[] args)
    {
        using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Test"].ConnectionString))
        {
            connection.Open();
            Console.WriteLine("Connected");
        }
    }
}

Окружающая среда:

  • SQL Server: Windows 2012 DC с экземпляром SQL Server 2014
  • Mono Environment: Ubuntu 16.04 с последней версией Mono-Complete
  • Версия .NET: 4.6.2 (также пробовал 4.5.2)

Обновление: я могу подтвердить, что с помощью FreeTDS я могу подключиться к экземпляру SQL Server из экземпляра Ubuntu, поэтому проблема кажется изолированной от запуска приложения.


person Jono_2007    schedule 17.11.2016    source источник
comment
Может ли какое-либо другое программное обеспечение в вашей системе Ubuntu подключиться?   -  person Dai    schedule 18.11.2016
comment
До сих пор я проверял, что машина Ubuntu может подключиться по телнету к этому хосту и этому порту и получить ответ, я собираюсь попробовать использовать что-то вроде бесплатного tds, чтобы увидеть, можно ли установить соединение TSQL.   -  person Jono_2007    schedule 18.11.2016
comment
Ваш журнал SQLServer показывает соединение? Любая ошибка?   -  person SushiHangover    schedule 18.11.2016
comment
Вы проверили, включен ли TCP/IP и открыт ли порт 1433 в брандмауэре? C:\Windows\SysWOW64\SQLServerManager12.msc   -  person Searching    schedule 18.11.2016
comment
@SushiHangover Я включил журналы аудита для любой попытки входа в систему и вижу, что журналы не создаются, когда я пытаюсь установить соединение.   -  person Jono_2007    schedule 19.11.2016
comment
@Searching Я настроил собственный порт для SQL Server, однако я отключил весь брандмауэр, чтобы проверить, была ли это проблема с брандмауэром, и это не повлияло на подключение   -  person Jono_2007    schedule 19.11.2016
comment
@Dai Я могу подтвердить, что с помощью Free TDS и команды TSQL я могу подключиться к базе данных.   -  person Jono_2007    schedule 19.11.2016


Ответы (1)


Я решил запустить еще один экземпляр Linux (на этот раз Debian), чтобы посмотреть, не может ли это быть проблемой среды. Я установил последнюю версию моно и т. д. Запуск того же приложения на самом деле дал мне больше информации, чем запуск в экземпляре Ubuntu:

Server does not exist or connection refused. ---> System.Net.Sockets.SocketException: Could not resolve host '<Host>\<Instance Name>'

Раньше я не получал дополнительных SocketException о том, что не может разрешить хост. Я не знаю, почему я не получил эту информацию об экземпляре Ubuntu.

Это заставило меня удалить Instance Name из строки подключения. Как только это было сделано, приложение заработало как положено.

person Jono_2007    schedule 19.11.2016
comment
Когда вы удалили имя экземпляра, вы сохранили остальную часть строки подключения как есть? Работает ли обновленная версия как в Ubuntu, так и в Linux? - person oarevalo; 20.10.2017
comment
Насколько я помню (проверив свою память), я оставил все как есть, за исключением удаления имени экземпляра. В то время это было в экземпляре Ubuntu 16.04, я не могу сказать, как это было бы в любом другом дистрибутиве. Извините, не может быть гораздо больше пользы - person Jono_2007; 20.10.2017
comment
Благодарю. У меня такая же проблема, но в моем случае удаление имени экземпляра не помогло. Он просто изменил сообщение об ошибке на "Mono.Data.Tds.Protocol.TdsInternalException: Server closed the connection.... - person oarevalo; 21.10.2017