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.

64 lines
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<T>, ReceiveAsync<T>)。
队列管理:
配置 BoundedChannelOptions:
SingleWriter = true, SingleReader = true。
FullMode = BoundedChannelFullMode.DropOldest。
提供优先级队列或标记(如心跳消息标记为高优先级)。
提供队列状态监控(SendQueueLength)。
性能优化:
批量发送:每 100ms 或 100 条消息(或 1MB)合并发送,可通过 WebSocketConfig 配置。
调度机制:使用 Task.Run 调度发送/接收任务。
内存管理:使用 ArrayPool<byte> 优化缓冲区。
优先级消息:心跳消息优先处理(独立队列或优先标记)。
生产环境优化:
错误处理:捕获网络中断、协议错误、队列满异常,记录结构化日志(ILogger,包含事件 ID)。
心跳机制:每 30 秒发送 PING 消息,更新 LastHeartbeat。
关闭流程:实现 CloseAsync,发送关闭帧(WebSocketCloseStatus.NormalClosure),释放资源。
中间件集成:调用 IMessageMiddleware 处理消息(支持条件跳过、缓存)。
状态监控:提供 LastHeartbeat 和队列长度。
设计原则:
单一职责:聚焦连接和队列管理,消息处理委托给中间件。
开闭原则:通过中间件支持扩展。
可观察性:记录连接、队列、错误事件(结构化日志)。
输出要求:
文件名为 WebSocketTransport.cs,位于 Services 目录。
建议 < 200 允许合理超限预计 ~220
实现 IWebSocketTransport 和 IDisposable,依赖 ILogger, WebSocketConfig, IMessageMiddleware。
包含详细注释,说明方法功能和优先级逻辑。
提供状态查询(IsConnected, SendQueueLength, LastHeartbeat)。