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
64 lines
2.5 KiB
2 weeks ago
|
.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)。
|
||
|
|
||
|
|