You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.5 KiB

.NET 8 WebSocket 传输实现提示词(WebSocketTransport.cs) 实现高性能 WebSocket 传输,负责连接管理、队列处理、消息发送/接收,适合生产环境。文件建议控制在 200 行以内(允许合理超限,预计 ~220 行)。 要求

核心功能:

实现 IWebSocketTransport,使用 System.Net.WebSockets.ClientWebSocket。 支持连接、断开、指数退避重连(初始 1 秒,最大 30 秒,最大尝试 5 次)。 使用 System.Threading.Channels.BoundedChannel(容量默认 1000,可配置)实现发送和接收队列。 支持异步写入(WriteAsync)和流式读取(ReadAllAsync)。

数据完整性:

处理分片帧:使用 MemoryStream 或 StringBuilder 拼接帧,直到 EndOfMessage 为 true。 验证消息完整性:支持 JSON/文本消息(JSON 解析),二进制消息通过中间件处理。 支持泛型消息(SendAsync, ReceiveAsync)。

队列管理:

配置 BoundedChannelOptions: SingleWriter = true, SingleReader = true。 FullMode = BoundedChannelFullMode.DropOldest。

提供优先级队列或标记(如心跳消息标记为高优先级)。 提供队列状态监控(SendQueueLength)。

性能优化:

批量发送:每 100ms 或 100 条消息(或 1MB)合并发送,可通过 WebSocketConfig 配置。 调度机制:使用 Task.Run 调度发送/接收任务。 内存管理:使用 ArrayPool 优化缓冲区。 优先级消息:心跳消息优先处理(独立队列或优先标记)。

生产环境优化:

错误处理:捕获网络中断、协议错误、队列满异常,记录结构化日志(ILogger,包含事件 ID)。 心跳机制:每 30 秒发送 PING 消息,更新 LastHeartbeat。 关闭流程:实现 CloseAsync,发送关闭帧(WebSocketCloseStatus.NormalClosure),释放资源。 中间件集成:调用 IMessageMiddleware 处理消息(支持条件跳过、缓存)。 状态监控:提供 LastHeartbeat 和队列长度。

设计原则:

单一职责:聚焦连接和队列管理,消息处理委托给中间件。 开闭原则:通过中间件支持扩展。 可观察性:记录连接、队列、错误事件(结构化日志)。

输出要求:

文件名为 WebSocketTransport.cs,位于 Services 目录。 建议 < 200 行,允许合理超限(预计 ~220 行)。 实现 IWebSocketTransport 和 IDisposable,依赖 ILogger, WebSocketConfig, IMessageMiddleware。 包含详细注释,说明方法功能和优先级逻辑。 提供状态查询(IsConnected, SendQueueLength, LastHeartbeat)。