ASP.NET Core MVC MySQL 服务器连接

Posted

技术标签:

【中文标题】ASP.NET Core MVC MySQL 服务器连接【英文标题】:ASP.NET Core MVC MySQL Server Connection 【发布时间】:2020-10-11 21:43:47 【问题描述】:

我在尝试建立与我在 ASP.NET Core MVC 3.1 中使用 Windows Server 2019 设置的服务器的连接时遇到问题。

我在服务器上安装的唯一东西是 mysql 套件和 IIS。该服务器也使用 VirtualBox 在我的计算机上本地托管,并使用桥接适配器进行设置。

ASP.NET Core MVC 项目是使用 Visual Studio 中的默认 MVC 选项创建的。此处不包含第三方服务。

在 ASP.NET Core 中,连接字符串如下所示:

"ConnectionStrings": 
     "ApplicationContext": "Server=<server IP/host name>;Initial Catalog=testdatabase;User ID=testuser;Password=testpassword;"

使用上述连接字符串运行项目时,我的浏览器中出现以下错误:

Win32Exception: 系统找不到指定的文件。未知 位置

SqlException:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器是 未找到或无法访问。验证实例名称是否为 正确,并且 SQL Server 配置为允许远程连接。 (提供者:TCP 提供者,错误:0 - 连接尝试失败 因为连接方在一段时间后没有正确响应 时间,或建立连接失败,因为连接的主机有 没有回应。) Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, uint waitForMultipleObjectsTimeout, bool allowCreate, bool onlyOneCheckConnection, DbConnectionOptions userOptions, out DbConnection内部连接)

但是,我终其一生都无法弄清楚为什么这不起作用。我已经浏览了很多互联网,但对 ASP.NET 如何与 MySQL 服务器交互以及我是否使用了不正确的参数知之甚少。我试过使用额外的参数,比如Trusted_Connection=True/False;MultipleActiveResultSets=True/False; 希望产生任何不同的结果,但仍然没有(我特别提到这两个,因为它们是默认出现的)。

为了测试服务器是否是罪魁祸首,我使用带有 PDO 的 php v7 复制了上面的连接字符串。

<?php
$server = "<server IP/host name>";
$port = 3306;
$db = "testdatabase";
$username = "testuser";
$password = "testpassword";

try 
    $conn = new PDO("mysql:host=$server;port=$port;dbname=$db", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Connected";
 catch (PDOException $err) 
    echo $err;


if ($conn) 
    $query = "SELECT * FROM testTable";
    $result = $conn->query($query);
 else 
    echo "Query failed";


foreach ($entity as $result) 
    echo "<br />" . $result["Id"];

?>

我可以确认这个 PHP 代码 100% 工作。

此外,我还测试了使用 Azure MySQL 以及使用在 Azure 中创建的生成的连接字符串来建立服务器连接。这也 100% 有效。

这让我相信我的 Windows Server 是罪魁祸首,它可能与一项或多项特定服务被禁用/阻止有关。但同时,如果PHP代码能够建立连接并抓取数据,那肯定不会是Connection String代码造成的吧??

我认为这个问题可能与我的控制器代码中的逻辑有关。

如果有人能提供一些见解,我将不胜感激。它可能只是超级简单的东西。

【问题讨论】:

糟糕,忘记在 JSON ConnectionString 中将“,3306”附加到“Server=”。这应该可以消除我发布的第二个错误。 当您说“服务器”时...我可以理解为您的意思是“MySQL 服务器”吗?如果是这样,那么我认为您的 .NET 连接字符串可能是错误的。它看起来像 MS SQL Server 数据库的连接字符串。 connectionstrings.com/mysql 可能会帮助您找到正确的连接字符串格式。我们还可以看到您在应用程序中用于与数据库通信的实际代码吗? “我认为这个问题可能与我的控制器代码中的逻辑有关”...您认为向我们展示这一点并描述您的预感是一个好主意吗? 还有什么原因导致“找不到文件”错误?您没有包含任何行号或代码引用来指向发生错误的位置。你试过调试它吗? P.S.您决定安装一个单独的 virtualbox 实例而不是直接在您的 PC 上安装 MySQL 有什么特别的原因吗?这对于开发/测试目的来说会简单得多。另外... .NET 代码是在 virtualbox 实例中运行,还是在您的主操作系统中运行(可能通过 Visual Studio)?这并不完全清楚。 【参考方案1】:

我会把这个留给路过的人。

Tl;dr:“Startup.cs”中的代码是导致此问题的驱动因素,即涉及向应用程序添加数据库上下文的部分。确保 Ubuntu 服务器也不会被防火墙策略阻止也很重要。

默认方法(使用 Microsoft SQL):

services.AddDbContext<DataContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DataContext")));

正确方法(使用 Pomelo):

services.AddDbContext<DataContext>(options => options.UseMySql(Configuration.GetConnectionString("DataContext")));

请注意“.UseSqlServer()”与“.UseMySql()”的区别。这是因为在我的 Ubuntu 服务器中,它是使用 MySQL 作为驱动程序而不是 MSSQL 驱动程序设置的。尝试使用“默认方法”的效果是导致尝试建立后端连接时出现各种问题。

安装参考:https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

以下部分与解决方案没有直接关系,但提供了我如何解决此问题的见解。

为了验证这一点,我还必须检查 Ubuntu 服务器本身的其他因素。即通过防火墙启用端口 3306,更改“mysql.cnf”文件中的“bind-address”参数,当然还要检查正在使用的 SQL 驱动程序本身的实际版本。

启用端口 3306:https://www.digitalocean.com/community/tutorials/how-to-allow-remote-access-to-mysql

更改“绑定地址”参数:https://www.cyberciti.biz/tips/how-do-i-enable-remote-access-to-mysql-database-server.html

检查 SQL 驱动版本:https://phoenixnap.com/kb/how-to-check-mysql-version

应用这些更改后(以及使用 Pomelo 的“.UseMySQL()”方法),我运行了我的应用程序,你瞧,涉及使用数据库连接的页面没有产生任何错误。它只是要求我“应用迁移”,就好像我正在使用本地数据库并且忘记更新数据库一样。

【讨论】:

这个来源docs.microsoft.com/en-us/ef/core/providers/… 对识别 SQL 驱动程序也有很大帮助。【参考方案2】:

由于您获得的是SqlException,因此您必须尝试使用​​System.Data.SqlClientMicrosoft.Data.SqlClient 连接(到MySQL 服务器)。这不受支持;这些仅适用于 Microsoft SQL Server。

安装MySqlConnector 并使用MySqlConnection 类建立连接。完整的连接字符串参考见https://mysqlconnector.net/connection-options/,但最简单的连接字符串将是"Server=&lt;server IP/host name&gt;;Database=testdatabase;User ID=testuser;Password=testpassword;"

【讨论】:

可以确认这对我的问题有帮助。非常感谢。

以上是关于ASP.NET Core MVC MySQL 服务器连接的主要内容,如果未能解决你的问题,请参考以下文章

Azure 云服务上的 Asp.Net Core MVC?

asp.net core2 mvc 基础教程--服务注册和管道

Asp.Net Core 空白模板搭建Mvc架构

ASP.NET Core MVC 身份功能在发布到服务器时不起作用

[Asp.Net Core]Autofac整合.NET5 MVC

[Asp.Net Core]Autofac整合.NET5 MVC