0

我正在开发需要在 Ubuntu Linux 18.04LTS 服务器上运行的 Blazor 服务器端项目。(注意:这个项目没有使用 Web Assembly。)

我正在使用 C# 和Pomelo.EntityFrameWorkCode.MySqlnuget 包 (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 状态,Func 操作,Func> verifySucceeded)

MySqlException:无法连接到任何指定的 MySQL 主机。C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection 连接,IOBehavior ioBehavior 中的 MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs,ILoadBalancer loadBalancer,IOBehavior ioBehavior,CancellationTokencancellationToken) , 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。

System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable+ConfiguredValueTaskAwaiter.GetResult() MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Nullable ioBehavior, CancellationToken cancelToken) 在 C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs MySql.Data.MySqlClient.MySqlConnection.Open() 在 C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(bool errorsExpected) Microsoft.EntityFrameworkCore.Storage .RelationalConnection.Open(bool errorsExpected)

Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlRelationalConnection.Open(布尔错误预期)

Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject) Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable+Enumerator.InitializeReader(DbContext _, bool result) Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute(TState state, Func操作,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 服务器上运行的任何想法。

谢谢

4

1 回答 1

1

感谢大家的反馈和评论。

经过几天的摆弄,我已经通过使用解决了这个问题

Server=localhost;

在生产连接字符串而不是 FQDN 中。

于 2020-02-23T02:07:43.973 回答