System.AggregateException: 发生一个或多个错误。 .Net Core 6 中的(未知套接字错误)
System.AggregateException: One or more errors occurred. (Unknown socket error) in .Net Core 6
我的团队从以下位置迁移了一个古老的应用程序:
AWS Elastic Compute Cloud instance
Windows Server 2019
IIS
.NET Core 2.2
Public subnets with an Internet Gateway
至
AWS Elastic Container Service (Fargate) task
Amazon Linux 2
Kestrel
.NET 6
Private subnets with no internet access at all
我们还在安全组、IAM 权限和其他途径中广泛加强了安全性。需要进行的更改太多,因此很难查明哪里出错了。
我们开始遇到来自我们网站的随机 500s(由 Kestrel 直接返回)、502s(来自 Application Load Balancer)和 504s(完全超时,来自 Application Load Balancer)。没有明显的原因。所有 API 调用似乎都表现出这种行为,似乎是随机的。
深入挖掘,我们发现了这样的错误:
---> System.Net.Sockets.SocketException (0xFFFDFFFE): Unknown socket error
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
at System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at System.Net.Sockets.TcpClient.CompleteConnectAsync(Task task)
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at MySql.Data.Common.StreamCreator.GetTcpStream(MySqlConnectionStringBuilder settings, MyNetworkStream& networkStream)
at MySql.Data.MySqlClient.NativeDriver.Open()
at MySql.Data.MySqlClient.Driver.Open()
at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
at MySql.Data.MySqlClient.MySqlPool.GetConnection()
at MySql.Data.MySqlClient.MySqlConnection.Open()
at -my code happens here-
不过,我怀疑问题不仅仅是我们的 MySQL RDS 连接。 502s 和 504s 表明有时 Kestrel 也无法正确响应请求,好像它也遇到了类似的问题。但是,至少在默认设置下,它不会记录任何与此相关的错误。
经过大量的调试终于。我们能够找出真正的根本原因。当请求失败时,我们有时会收到以下错误。
我的队友获取了此日志并通过删除用于 window 服务器的 SafeFileHandle 找到了问题解决方案。
我的团队从以下位置迁移了一个古老的应用程序:
AWS Elastic Compute Cloud instance
Windows Server 2019
IIS
.NET Core 2.2
Public subnets with an Internet Gateway
至
AWS Elastic Container Service (Fargate) task
Amazon Linux 2
Kestrel
.NET 6
Private subnets with no internet access at all
我们还在安全组、IAM 权限和其他途径中广泛加强了安全性。需要进行的更改太多,因此很难查明哪里出错了。
我们开始遇到来自我们网站的随机 500s(由 Kestrel 直接返回)、502s(来自 Application Load Balancer)和 504s(完全超时,来自 Application Load Balancer)。没有明显的原因。所有 API 调用似乎都表现出这种行为,似乎是随机的。
深入挖掘,我们发现了这样的错误:
---> System.Net.Sockets.SocketException (0xFFFDFFFE): Unknown socket error
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
at System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at System.Net.Sockets.TcpClient.CompleteConnectAsync(Task task)
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at MySql.Data.Common.StreamCreator.GetTcpStream(MySqlConnectionStringBuilder settings, MyNetworkStream& networkStream)
at MySql.Data.MySqlClient.NativeDriver.Open()
at MySql.Data.MySqlClient.Driver.Open()
at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
at MySql.Data.MySqlClient.MySqlPool.GetConnection()
at MySql.Data.MySqlClient.MySqlConnection.Open()
at -my code happens here-
不过,我怀疑问题不仅仅是我们的 MySQL RDS 连接。 502s 和 504s 表明有时 Kestrel 也无法正确响应请求,好像它也遇到了类似的问题。但是,至少在默认设置下,它不会记录任何与此相关的错误。
经过大量的调试终于。我们能够找出真正的根本原因。当请求失败时,我们有时会收到以下错误。
我的队友获取了此日志并通过删除用于 window 服务器的 SafeFileHandle 找到了问题解决方案。