不管我怎么做,MySQL.NET适配器都拒绝从Mono连接

不管我怎么做,MySQL.NET适配器都拒绝从Mono连接,mysql,mono,mysql-connector,Mysql,Mono,Mysql Connector,我正在尝试与另一台机器上的MySql数据库建立简单连接。我可以在Windows上通过telnet连接到数据源,并使用OSX和Ubuntu上的终端——包括网络内部和外部。但它拒绝通过我在OSX上的mono项目进行连接 我收到: 无法连接到任何指定的MySQL主机 我已经确认没有有效的防火墙规则——在我的OSX或Ubuntu机器上都没有,因为数据库是托管在那里的。MySQL workbench与mono项目位于同一台机器上,可以毫无问题地进行连接 我已尝试通过以下代码连接到数据库: 服务器=myIp

我正在尝试与另一台机器上的MySql数据库建立简单连接。我可以在Windows上通过telnet连接到数据源,并使用OSX和Ubuntu上的终端——包括网络内部和外部。但它拒绝通过我在OSX上的mono项目进行连接

我收到:

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

我已经确认没有有效的防火墙规则——在我的OSX或Ubuntu机器上都没有,因为数据库是托管在那里的。MySQL workbench与mono项目位于同一台机器上,可以毫无问题地进行连接

我已尝试通过以下代码连接到数据库:

服务器=myIp;数据库=FK;使用者 ID=乔治;密码=通过;端口=3306

通过预装在OSX上Mono中的插件:

Tools>Database>adddatabase Connection>MySql数据库

我不使用我的连接字符串——我让它根据我的数据库信息创建自己的连接字符串。然而,这没有什么区别。当我测试我的连接时——它仍然失败,与我尝试通过编程连接时收到的消息相同

托管mySQL数据库的服务器未显示任何连接尝试

我尝试使用5.2 mono.NET连接器和6.3连接器(v2和v4)。没关系,两者都无法连接

我已尝试将程序集放置在GAC中,并在bin目录中本地放置到我的项目中。这没什么区别

我在连接协议中尝试了套接字和tcp,以及内存和管道。没用

这对我来说完全没有意义,为什么我不能连接到我的服务器,在那里它可以在任何地方工作,除了从Mono内部。没有正在运行的防火墙会阻止我的请求

从Mono连接应该不会这么困难,所以在某些地方显然是非常错误的——看到IDE甚至无法连接到数据库

我的凭证是绝对正确的,尽管这无关紧要——因为我甚至不能点击服务器。我假设它正在尝试连接,因为大约需要10-15秒才能收到一个表示它无法连接的响应

当部署到我的Ubuntu服务器(与mySQL服务器位于一个单独的机器和网络上)时,相同的代码连接良好,该服务器通过mono和apache提供服务。这可能是XSP问题吗?我不知道


我花了无数个小时试图让它工作,通过每一个教程和网站,我可以找到从mono连接到mySQL。每个人的结论都和上一次一样,都是失败。有什么帮助吗?

以下是我为让它连接所做的

  • 下载MySql.Data适配器的源代码
  • 替换
    StreamCreator.cs
    CreateSocketStream
    方法(请参见代码注释中的)


  • 显然,这是一个丑陋的和黑客。然而,我没有找到其他方法,除了我在上面评论的让OSX+Mono连接的方法。如果没有这些更改,它将无法工作。

    如果这是Redhat/Fedora,我会说检查SELinux日志。Ubuntu有“AppArmor”--也许它有一个可能会干扰的日志或设置?@Charles I实际上通过遍历MySQL适配器代码发现了这个问题。这与OSX没有被识别为我的操作系统和端点问题有关。我很快就会发布我的解决方案。谢谢
     private Stream CreateSocketStream(IPAddress ip, bool unix)
        {
            EndPoint endPoint;
    
            // You don't need the following lines.
            //if (!Platform.IsWindows() && unix)
            //  endPoint = CreateUnixEndPoint(hostList);
            //else
    
            // Instead create a regular IPEndPoint.
            endPoint = new IPEndPoint(ip, (int)port);
            // Replace the socket it is trying to use with the following.
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            if (keepalive > 0)
            {
                SetKeepAlive(socket, keepalive);
            }
             // Remove the async.  connection.  This hangs and fails.  Not sure why.
            //IAsyncResult ias = socket.BeginConnect(endPoint, null, null);
            //if (!ias.AsyncWaitHandle.WaitOne((int)timeOut * 1000, false))
            //{
            //  socket.Close();
            //  return null;
            //}
            try {
                // Instead do a regular blocking connect to the endpoint.
                socket.Connect(endPoint);
            } catch (Exception ex) {
                throw;
            }
    
            // No longer relevant.
            //try
            //{
            //  socket.EndConnect(ias);
            //}
            //catch (Exception)
            //{
            //  socket.Close();
            //    throw;
            //}
            MyNetworkStream stream = new MyNetworkStream(socket, true);
            GC.SuppressFinalize(socket);
            GC.SuppressFinalize(stream);
            return stream;
        }