我有点困惑,因为我的应用程序没有捕捉到异常。然而,这只发生在租用的远程机器上。机器运行Ubuntu 22.04和最新的dotnet运行环境。
在我的本地Windows机器或Docker上一切都按预期工作。如果无法在那里建立连接,您将在catch块中结束。(经典!在我的机器上工作)
在await connection.OpenAsync()
期间发生错误,整个应用程序被终止。输出窗口的调试日志中输出以下内容:
Exception thrown: 'System.IO.IOException' in System.Private.CoreLib.dll
The program '[77028] dotnet' has exited with code 0 (0x0).
对于数据库连接,我使用与Dapper连接的https://mysqlconnector.net/连接器。
我完全不明白的是,该方法还用于另一个应用程序,并且在同一台机器上工作时没有问题。
行为奇怪的方法
private async Task<MySqlConnection> GetDbConnectionAsync()
{
Exception? connectionException = default;
foreach (var connectionString in _connectionStrings)
{
var dbHost = connectionString.Split(';')
.First(s => s.Contains("Server", StringComparison.OrdinalIgnoreCase))
.Split('=')[1];
try
{
// Open database connection async
var connection = new MySqlConnection(connectionString);
await connection.OpenAsync(); // <-- THIS CRASHING THE APPLICATION
// Set connection session variables
await SetSessionVars(connection);
return connection;
}
catch (Exception ex)
{
connectionException = ex;
_log.LogError(ex,
$"[Data Access Layer]{Environment.NewLine}" +
$"Connection to database failed. Tried host: {dbHost}. Exception Message: {ex.Message}");
}
}
_log.LogError($"[Data Access Layer]{Environment.NewLine}" +
"All configured database nodes are not reachable. Connection failure. Wait for 5 seconds and will retry.");
await Task.Delay(5000);
throw new
InvalidOperationException("[Data Access Layer] All configured database nodes are not reachable. Connection failure. Wait for 5 seconds and will retry.",
connectionException);
}
我真的很感谢所有的提示。
1条答案
按热度按时间k4emjkb11#
好的,我的错误。机器已经有一个Blazor应用程序在同一个Kestrel端口5000上运行。对于所有面临这样一个问题的人来说,在Debug -〉Windows -〉Exception settings菜单下设置为所有异常中断执行可能会非常有帮助。
由于BackgroundService已经启动并并行运行,因此很难看出Kestrel Web服务器尚未在后台完全启动,并且在BackgroundService尝试连接到数据库时始终会发生IoException。
不要忘记重置异常设置,这样调试体验就不会受到影响。