在 linux (debian 11) 容器中运行我的 .net core 6 mvc 应用程序时,在对同一控制器操作进行某些连续调用后出现以下错误。此操作读取 http 响应正文并执行一些数据库操作,然后在响应中返回 json 对象。
完整的错误堆栈如下- 2024-04-12T17:13:16.217-07:00 [40m[1m[33mwarn[39m[22m[49m: Microsoft.AspNetCore.Server.Kestrel[0]] 2024-04-12T17:13:16.217-07:00 连接处理异常结束。 2024-04-12T17:13:16.217-07:00 System.InvalidOperationException:句柄已被另一个 Socket 使用。 2024-04-12T17:13:16.217-07:00 在 System.Net.Sockets.SocketAsyncEngine.TryRegisterCore(IntPtr socketHandle,SocketAsyncContext 上下文,错误和错误) 2024-04-12T17:13:16.217-07:00 在 System.Net.Sockets.SocketAsyncEngine.TryRegisterSocket(IntPtr socketHandle、SocketAsyncContext 上下文、SocketAsyncEngine& 引擎、Error& 错误) 2024-04-12T17:13:16.217-07:00 在 System.Net.Sockets.SocketAsyncContext.TryRegister(错误&错误) 2024-04-12T17:13:16.217-07:00在System.Net.Sockets.SocketAsyncContext.OperationQueue
1.StartAsyncOperation(SocketAsyncContext context, TOperation operation, Int32 observedSequenceNumber, CancellationToken cancellationToken) 2024-04-12T17:13:16.217-07:00 at System.Net.Sockets.SocketAsyncContext.ReceiveAsync(Memory
1缓冲区,SocketFlags标志,Int32&bytesReceived,Action5 callback, CancellationToken cancellationToken) 2024-04-12T17:13:16.217-07:00 at System.Net.Sockets.SocketAsyncEventArgs.DoOperationReceive(SafeSocketHandle handle, CancellationToken cancellationToken) 2024-04-12T17:13:16.217-07:00 at System.Net.Sockets.Socket.ReceiveAsync(SocketAsyncEventArgs e, CancellationToken cancellationToken) 2024-04-12T17:13:16.217-07:00 at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketReceiver.WaitForDataAsync(Socket socket) 2024-04-12T17:13:16.217-07:00 at Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal.SocketConnection.DoReceive() 2024-04-12T17:13:16.217-07:00 at System.IO.Pipelines.Pipe.GetReadResult(ReadResult& result) 2024-04-12T17:13:16.217-07:00 at System.IO.Pipelines.Pipe.ReadAsync(CancellationToken token) 2024-04-12T17:13:16.217-07:00 at System.IO.Pipelines.Pipe.DefaultPipeReader.ReadAsync(CancellationToken cancellationToken) 2024-04-12T17:13:16.217-07:00 at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.BeginRead(ValueTask
1&等待)
2024-04-12T17:13:16.217-07:00 在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication1 application) 2024-04-12T17:13:16.217-07:00 at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequestsAsync[TContext](IHttpApplication
1 个应用程序)
我启用了调试级别日志以了解有关该问题的更多信息。这仅指出了这样的问题:经过几次尝试后,该端点调用的套接字连接并未正常关闭。
在容器中启用调试级别日志后,发现kestrel在几次上传后没有正常关闭套接字连接。
为什么它没有正常关闭连接?因为我们通过代码创建和处置 SafeFileHandle(IntPtr.Zero) 实例。
这些博客文章帮助我找到了根本原因并解决了这个问题。
https://github.com/dotnet/runtime/issues/64305
https://github.com/fabian-blum/AspNetCore.Identity.LiteDB/pull/14