From d03cdc9006119fb2279b1925e2f0e51089bb8798 Mon Sep 17 00:00:00 2001 From: root <295172551@qq.com> Date: Sat, 26 Jul 2025 20:24:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20WebSocketMiddleware=20?= =?UTF-8?q?=E7=BC=93=E5=86=B2=E5=8C=BA=E9=97=AE=E9=A2=98=EF=BC=9A1)=20?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E7=BC=93=E5=86=B2=E5=8C=BA=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?=E4=B8=BA=20MaxMessageSize=202)=20=E7=A7=BB=E9=99=A4=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=E6=B6=88=E6=81=AF=E7=BC=93=E5=86=B2=E5=8C=BA=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E6=AF=8F=E4=B8=AA=E6=B6=88=E6=81=AF=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E7=8B=AC=E7=AB=8B=E7=BC=93=E5=86=B2=E5=8C=BA=203)=20?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20using=20=E8=AF=AD=E5=8F=A5=E7=A1=AE?= =?UTF-8?q?=E4=BF=9D=E8=B5=84=E6=BA=90=E6=AD=A3=E7=A1=AE=E9=87=8A=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Middleware/WebSocketMiddleware.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/X1.WebSocket/Middleware/WebSocketMiddleware.cs b/src/X1.WebSocket/Middleware/WebSocketMiddleware.cs index 112d2f5..b9d40c8 100644 --- a/src/X1.WebSocket/Middleware/WebSocketMiddleware.cs +++ b/src/X1.WebSocket/Middleware/WebSocketMiddleware.cs @@ -73,7 +73,8 @@ public class WebSocketMiddleware private readonly IWebSocketMessageQueueManager _messageQueueManager; private readonly ILogger _logger; private readonly WebSocketOptions _options; - private readonly WebSocketMessageBuffer _messageBuffer; + // 移除共享的消息缓冲区,改为每个连接创建独立的缓冲区 + // private readonly WebSocketMessageBuffer _messageBuffer; private readonly WebSocketErrorHandler _errorHandler; private readonly WebSocketPerformanceMonitor _performanceMonitor; // 使用 WebSocket Channel 管理器来管理 Channel 的生命周期 @@ -100,7 +101,6 @@ public class WebSocketMiddleware _messageQueueManager = messageQueueManager; _logger = logger; _options = options.Value; - _messageBuffer = new WebSocketMessageBuffer(_options.MaxMessageSize); _errorHandler = new WebSocketErrorHandler(logger, _options.MessageRetryCount, _options.MessageRetryInterval); _performanceMonitor = new WebSocketPerformanceMonitor(logger); @@ -170,7 +170,7 @@ public class WebSocketMiddleware // 使用原子操作的状态标志,确保线程安全 var processingState = new AtomicBoolean(false); // 从内存池租借缓冲区,用于接收消息 - var buffer = ArrayPool.Shared.Rent(1024 * 4); + var buffer = ArrayPool.Shared.Rent(_options.MaxMessageSize); // 使用 Channel 管理器创建新的消息通道 var messageChannel = await _channelManager.CreateNewMessageChannel(connectionId); @@ -390,7 +390,10 @@ public class WebSocketMiddleware var success = await _errorHandler.HandleWithRetryAsync(async () => { - if (!_messageBuffer.TryWrite(buffer, 0, receiveResult.Count)) + // 为每个消息创建独立的消息缓冲区,避免并发问题 + using var messageBuffer = new WebSocketMessageBuffer(_options.MaxMessageSize); + + if (!messageBuffer.TryWrite(buffer, 0, receiveResult.Count)) { throw new WebSocketException("消息缓冲区溢出"); } @@ -400,7 +403,7 @@ public class WebSocketMiddleware var message = new WebSocketMessage { ConnectionId = connectionId, - Data = _messageBuffer.GetMessage(), + Data = messageBuffer.GetMessage(), MessageType = receiveResult.MessageType, IsComplete = true }; @@ -416,8 +419,7 @@ public class WebSocketMiddleware // 记录 Channel 消息处理统计 _channelManager.RecordMessageProcessed(messageChannel, message.Data.Length); - _messageBuffer.Reset(); - //messageStartTime = DateTime.UtcNow; + // messageBuffer 会在 using 语句中自动释放 } });