"无法连接到任何指定的MySQL主机"在C#中通过SSH.NET隧道连接到MySQL数据库时

时间:2018-03-19 18:34:15

标签: c# mysql .net ssh ssh.net

我尝试使用C#和SSH.Net连接到在Ubuntu上运行的MySQL数据库。

我们的MySQL数据库只允许来自网络服务器的连接,并从我从下面的代码中看到,客户端对象连接到网络服务器,然后我打开一个端口映射到数据库服务器上的3306。最后,MySQLConnection对象打开与MySQL DB的连接。

但是我在sql.Open()声明中得到例外:

  

无法连接到任何指定的MySQL主机

我已经检查了同一主题的其他主题,并尝试了他们的建议,但似乎没有人帮助我。

还有更多。

以下是我使用的一些测试代码 -

var ci =
     new ConnectionInfo(
         "server", "userid", new PasswordAuthenticationMethod("userid", "userpwd"));
using (var client = new SshClient(ci))
{
    client.Connect();
    if (client.IsConnected) //This part works fine - I can connect to my Webserver.
    {
        //not sure if this is correct in our context.
        var local = new ForwardedPortDynamic("127.0.0.1",3306); 
        client.AddForwardedPort(local);
        try
        {
            local.Start();
        }
        catch (SocketException se)
        {

        }
        string connStr =
            "Server = dbserver;Port = 3306;Database = dbname;Uid = dbuserid;Pwd = dbpwd;";
        MySqlConnection sql = new MySqlConnection(connStr);

        try
        {
            sql.Open();
            local.Stop();
        }
        catch (MySqlException se)
        {
        }
    }
}

我在代码中放入的所有凭据都从MySQL DBbench连接到MySQL数据库。

我专门在Windows环境中工作,所以如果你想让我在Ubuntu服务器上检查一下,请告诉我,如果可能的话,如何检查它。

1 个答案:

答案 0 :(得分:1)

您正在通过SSH隧道进行连接。

因此,您的主要问题是连接字符串中的Host必须是localhost(SSH隧道的本地端),而不是dbserver。或者甚至更好,使用ForwardedPort.boundHost(和ForwardedPort.boundPort)。

第二个问题是,您无法使用ForwardedPortDynamic,而是使用ForwardedPortLocal

var forwardedPort = new ForwardedPortLocal("127.0.0.1", "127.0.0.1", 3306);

client.AddForwardedPort(forwardedPort);
forwardedPort.Start();

string connStr =
    string.Format(
        "Server = {0};Port = {1};Database = dbname;Uid = dbuserid;Pwd = dbpwd;",
        forwardedPort.BoundHost, forwardedPort.BoundPort);

另见Connection to MySQL from .NET using SSH.NET Library

如果您的数据库没有在网络服务器上运行,而是在dbhost上运行,则必须在ForwardedPortLocal构造函数中使用该数据库:

var forwardedPort = new ForwardedPortLocal("127.0.0.1", "dbhost", 3306);