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.SqlClient
或Microsoft.Data.SqlClient
连接(到MySQL 服务器)。这不受支持;这些仅适用于 Microsoft SQL Server。
安装MySqlConnector 并使用MySqlConnection
类建立连接。完整的连接字符串参考见https://mysqlconnector.net/connection-options/,但最简单的连接字符串将是"Server=<server IP/host name>;Database=testdatabase;User ID=testuser;Password=testpassword;"
。
【讨论】:
可以确认这对我的问题有帮助。非常感谢。以上是关于ASP.NET Core MVC MySQL 服务器连接的主要内容,如果未能解决你的问题,请参考以下文章
asp.net core2 mvc 基础教程--服务注册和管道
ASP.NET Core MVC 身份功能在发布到服务器时不起作用