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 语句中自动释放 } });