c# - 在 C# 中通过 SSH.NET 隧道连接到 MySQL 数据库时出现 "Unable to connect to any of the specified MySQL hosts"

标签 c# mysql .net ssh ssh.net

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

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

但是我在 sql.Open() 语句中遇到异常:

Unable to connect to any of the specified MySQL hosts

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

还有更多。

这是我正在使用的一些测试代码 -

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 数据库的有效 MySQLWorkbench 连接中删除。

我只在 Windows 环境中工作,所以如果您希望我检查 Ubuntu 服务器上的某些内容,请尽可能告诉我如何检查它。

最佳答案

您正在通过 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);

关于c# - 在 C# 中通过 SSH.NET 隧道连接到 MySQL 数据库时出现 "Unable to connect to any of the specified MySQL hosts",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49370107/

相关文章:

mysql - 优雅的 mysql 从一个表中选择、分组、组合多行

.net - .NET 对象创建是 "ex nihilo"吗?

c# - 在遍历列表的浅拷贝时从列表中删除

c# - 自定义 URL 中带有 + 号的参数

c# - 如何避免在 WebView 中失去对 HTML 元素的输入焦点?

c# - SQLite + SpatiaLite 问题

c# - 二进制搜索算法的扩展,用于查找要在数组中搜索的键值的第一个和最后一个索引

mysql - 仅针对 MyISAM 表更改 mysql 中的表

mysql - 如何使用带变量的 MySQL 存储过程?

c# - 使用 .NET Core WebApp 访问 AWS ElasticBeanstalk 自定义环境变量