【发布时间】:2026-01-21 06:00:02
【问题描述】:
我正在开发需要在 Ubuntu Linux 18.04LTS 服务器上运行的 Blazor 服务器端项目。 (注意:这个项目没有使用 Web Assembly。)
我正在使用 C# 和 Pomelo.EntityFrameWorkCode.MySql nuget 包 (v3.1.1) 连接到在 Linux 服务器上运行的 MySQL 数据库。
当我在我的 Windows 开发系统上本地运行应用程序时,一切正常。当我将文件发布到 Linux 服务器时,它大约有 5% 的时间工作 - 其余的我收到一条错误消息
Pomelo MySqlException: 无法连接到任何指定的 MySQL 主机
我在我的 Windows 系统和 Linux 服务器上都连接到同一个 MySQL 数据库。 MySQL 在 Linux 上运行,正确的端口是开放的,等等。
更详细的错误信息是:
处理请求时发生未处理的异常。 MySqlException:无法连接到任何指定的 MySQL 主机。 C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs 中的 MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, ILoadBalancer loadBalancer, IOBehavior ioBehavior, CancellationToken cancelToken),第 442 行
InvalidOperationException:引发了一个异常,可能是由于暂时性故障。考虑通过将“EnableRetryOnFailure()”添加到“UseMySql”调用来启用瞬时错误恢复能力。 Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute(TState state, Func operation, Func> verifySucceeded)
MySqlException:无法连接到任何指定的 MySQL 主机。 MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, ILoadBalancer loadBalancer, IOBehavior ioBehavior, CancellationToken cancelToken) 在 C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection connection, IOBehavior ioBehavior, CancellationToken cancelToken) in > C:\projects\mysqlconnector\src\MySqlConnector\Core\ConnectionPool.cs MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection connection, IOBehavior ioBehavior, CancellationToken cancelToken) in > C:\projects\mysqlconnector\src\MySqlConnector\Core\ConnectionPool.cs System.Threading.Tasks.ValueTask.get_Result() System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable+ConfiguredValueTaskAwaiter.GetResult() MySql.Data.MySqlClient.MySqlConnection.CreateSessionAsync(ConnectionPool pool, Nullable ioBehavior, CancellationToken cancelToken) 在 C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs System.Threading.Tasks.ValueTask.get_Result()
System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable+ConfiguredValueTaskAwaiter.GetResult() C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs 中的 MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Nullable ioBehavior, CancellationToken cancelToken) C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs 中的 MySql.Data.MySqlClient.MySqlConnection.Open() Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(布尔错误预期) Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(bool errorsExpected)
Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlRelationalConnection.Open(bool errorsExpected)
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject) Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable+Enumerator.InitializeReader(DbContext _, bool 结果) Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute(TState state, Func operation, Func> verifySucceeded)
Startup 类中的配置如下所示:
services.AddDbContext<LabDataDbContext>(options => {
options.UseMySql(Configuration.GetConnectionString("LabDbConnection"));
options.EnableDetailedErrors();
});
我的连接字符串是:
"server=server.grafton.internal;port=3306;database=labdb;user=******;password=******;charset=utf8"
有趣的是我可以使用 MySQL Workbench 并使用完全相同的凭据从我的 Windows 开发系统或 Linux 服务器连接到数据库。
此应用程序设计为仅在内部运行,并且运行该应用程序的服务器在 Internet 上不可见,因此我不太关心安全问题(如果有人想知道一群自闭症儿童有什么设备和活动,他们可以拥有!!)
在尝试隔离错误时,我已将应用程序完全删除并重新部署到网络上的不同 linux 服务器,结果相同,但正如我之前所说,大约 5% 的时间,应用程序按预期工作在 linux 服务器上。
应用程序中不使用数据库的其他页面工作正常,所以我认为这不是 Web 服务器的问题(NGinx 作为 Kestrel 的反向代理)。
我还想强调的是,该应用大约 5% 的时间在 linux 上运行,100% 的时间在 Windows 上运行 - 两者都连接到在 linux 上运行的同一个 MySQL 服务器。
如果需要更多代码示例,该应用位于 Github 上,地址为 https://github.com/SteveTeece/Lab。
这个让我难过。非常感谢有关如何解决此问题并使其在 Linux 服务器上运行的任何想法。
谢谢
【问题讨论】:
-
更新:我已将 services.AddDbContext() 调用更改为包含每个docs.microsoft.com/en-us/ef/core/miscellaneous/… 的“options => options.EnableRetryOnFailure()”,而我现在得到的只是超时错误。
-
有时,ConnectionString 真的是一个因数据库而异的怪物。更糟糕的是,关键字的顺序很重要。 .您能否尝试将连接字符串更改为
Server=server.grafton.internal;Port=3306;Database=labdb;Uid=***;Pwd=**;SslMode=None;ConnectionTimeout=0? -
不错的想法@itminus。我已经按照您的建议更改了连接字符串,但是结果没有变化。我仍然收到 504 超时错误。自从我启用失败时重试以来,这没有改变。
标签: mysql entity-framework asp.net-core blazor-server-side pomelo-entityframeworkcore-mysql