diff --git a/CoreAgent.WebSocketTransport/Examples/ChannelManagerTestExample.cs b/CoreAgent.WebSocketTransport/Examples/ChannelManagerTestExample.cs index 7bf3ea4..3cfe289 100644 --- a/CoreAgent.WebSocketTransport/Examples/ChannelManagerTestExample.cs +++ b/CoreAgent.WebSocketTransport/Examples/ChannelManagerTestExample.cs @@ -31,7 +31,7 @@ public class ChannelManagerTestExample // 测试发送消息 await _channelManager.SendChannel.WriteAsync("Test message 1"); await _channelManager.SendChannel.WriteAsync("Test message 2"); - await _channelManager.PriorityChannel.WriteAsync("Priority message"); + //await _channelManager.PriorityChannel.WriteAsync("Priority message"); _logger.LogInformation("消息发送成功"); diff --git a/CoreAgent.WebSocketTransport/Examples/CompositionPatternExample.cs b/CoreAgent.WebSocketTransport/Examples/CompositionPatternExample.cs index 1be3bb5..90588ef 100644 --- a/CoreAgent.WebSocketTransport/Examples/CompositionPatternExample.cs +++ b/CoreAgent.WebSocketTransport/Examples/CompositionPatternExample.cs @@ -59,7 +59,7 @@ public class CompositionPatternExample await _channelManager.SendChannel.WriteAsync("Normal message"); // 发送优先级消息 - await _channelManager.PriorityChannel.WriteAsync("Priority message"); + //await _channelManager.PriorityChannel.WriteAsync("Priority message"); // 等待消息发送完成 await Task.Delay(1000); diff --git a/CoreAgent.WebSocketTransport/Interfaces/IMessageChannelManager.cs b/CoreAgent.WebSocketTransport/Interfaces/IMessageChannelManager.cs index 9f089b6..07a66d2 100644 --- a/CoreAgent.WebSocketTransport/Interfaces/IMessageChannelManager.cs +++ b/CoreAgent.WebSocketTransport/Interfaces/IMessageChannelManager.cs @@ -1,3 +1,5 @@ +using CoreAgent.WebSocketTransport.Models; + namespace CoreAgent.WebSocketTransport.Interfaces; /// @@ -19,7 +21,7 @@ public interface IMessageChannelManager : IDisposable /// /// 获取优先级消息通道(用于心跳等) /// - IMessageChannel PriorityChannel { get; } + IMessageChannel PriorityChannel { get; } /// /// 获取通道状态信息 diff --git a/CoreAgent.WebSocketTransport/Models/HeartbeatMessage.cs b/CoreAgent.WebSocketTransport/Models/HeartbeatMessage.cs new file mode 100644 index 0000000..e3d2693 --- /dev/null +++ b/CoreAgent.WebSocketTransport/Models/HeartbeatMessage.cs @@ -0,0 +1,31 @@ +using System; + +namespace CoreAgent.WebSocketTransport.Models +{ + /// + /// 心跳消息实体模型 + /// + public class HeartbeatMessage + { + /// + /// 消息类型 + /// + public string Type { get; set; } = "heartbeat"; + + /// + /// 消息载荷 + /// + public HeartbeatPayload Payload { get; set; } = new HeartbeatPayload(); + } + + /// + /// 心跳消息载荷 + /// + public class HeartbeatPayload + { + /// + /// 心跳消息内容 + /// + public string Message { get; set; } = "ping"; + } +} \ No newline at end of file diff --git a/CoreAgent.WebSocketTransport/Services/MessageChannelManager.cs b/CoreAgent.WebSocketTransport/Services/MessageChannelManager.cs index 916cded..7e2fe3c 100644 --- a/CoreAgent.WebSocketTransport/Services/MessageChannelManager.cs +++ b/CoreAgent.WebSocketTransport/Services/MessageChannelManager.cs @@ -1,4 +1,5 @@ using CoreAgent.WebSocketTransport.Interfaces; +using CoreAgent.WebSocketTransport.Models; using Microsoft.Extensions.Logging; namespace CoreAgent.WebSocketTransport.Services; @@ -15,7 +16,7 @@ public class MessageChannelManager : IMessageChannelManager public IMessageChannel SendChannel { get; } public IMessageChannel ReceiveChannel { get; } - public IMessageChannel PriorityChannel { get; } + public IMessageChannel PriorityChannel { get; } /// /// 构造函数 @@ -36,7 +37,7 @@ public class MessageChannelManager : IMessageChannelManager { SendChannel = new ChannelMessageChannel(sendChannelCapacity); ReceiveChannel = new ChannelMessageChannel(receiveChannelCapacity); - PriorityChannel = new ChannelMessageChannel(priorityChannelCapacity); + PriorityChannel = new ChannelMessageChannel(priorityChannelCapacity); _logger.LogInformation("消息通道管理器已创建 - 发送通道容量: {SendCapacity}, 接收通道容量: {ReceiveCapacity}, 优先级通道容量: {PriorityCapacity}", sendChannelCapacity, receiveChannelCapacity, priorityChannelCapacity); diff --git a/CoreAgent.WebSocketTransport/Services/WebSocketTransport.cs b/CoreAgent.WebSocketTransport/Services/WebSocketTransport.cs index e27b85f..ae49c2e 100644 --- a/CoreAgent.WebSocketTransport/Services/WebSocketTransport.cs +++ b/CoreAgent.WebSocketTransport/Services/WebSocketTransport.cs @@ -5,6 +5,8 @@ using Microsoft.Extensions.Logging; using CoreAgent.WebSocketTransport.Interfaces; using CoreAgent.WebSocketTransport.Models; using CoreAgent.WebSocketTransport.Middleware; +using System.Text.Json.Serialization; +using System.Text.Json; namespace CoreAgent.WebSocketTransport.Services; @@ -282,12 +284,12 @@ public class WebSocketTransport : IWebSocketTransport { while (!cancellationToken.IsCancellationRequested) { - await Task.Delay(TimeSpan.FromSeconds(30), cancellationToken); - if (_isConnected && _connection.IsConnected) { + _channelManager.PriorityChannel.TryWrite(new HeartbeatMessage()); UpdateHeartbeat(); } + await Task.Delay(TimeSpan.FromSeconds(120), cancellationToken); } } catch (Exception ex) @@ -324,9 +326,10 @@ public class WebSocketTransport : IWebSocketTransport while (_channelManager.PriorityChannel.TryRead(out var priorityMessage)) { priorityMessageCount++; + if (priorityMessage is null) continue; _logger.LogTrace("处理优先级消息 #{PriorityCount}: {MessageType}", priorityMessageCount, priorityMessage?.GetType().Name ?? "null"); - await SendSingleMessageAsync(priorityMessage, cancellationToken); + await SendSingleMessageAsync(JsonSerializer.Serialize(priorityMessage), cancellationToken); } // 处理普通消息 diff --git a/CoreAgent.WebSocketTransport/modify.md b/CoreAgent.WebSocketTransport/modify.md index fb1e1b4..3f4ad1b 100644 --- a/CoreAgent.WebSocketTransport/modify.md +++ b/CoreAgent.WebSocketTransport/modify.md @@ -784,4 +784,53 @@ private async Task ConnectInternalAsync(CancellationToken cancellationToken) - WebSocket 传输服务注册 - 配置管理 - 中间件集成 -- 应用程序启动流程 \ No newline at end of file +- 应用程序启动流程 + +## 2024-12-19 - 心跳消息实体模型创建 + +### 新增文件 +- **HeartbeatMessage.cs**: 心跳消息实体模型,包含消息类型和载荷结构 + +### 模型设计 +1. **HeartbeatMessage 类** + - `Type` 属性:消息类型,默认值为 "heartbeat" + - `Payload` 属性:消息载荷,类型为 HeartbeatPayload + +2. **HeartbeatPayload 类** + - `Message` 属性:心跳消息内容,默认值为 "ping" + +### 设计特点 +- 符合 JSON 结构:`{"type": "heartbeat", "payload": {"message": "ping"}}` +- 使用默认值初始化,简化使用 +- 包含完整的 XML 文档注释 +- 遵循 C# 命名规范 + +### 使用场景 +- WebSocket 心跳检测 +- 连接状态监控 +- 网络连通性测试 +- 服务器健康检查 + +### 技术实现 +```csharp +public class HeartbeatMessage +{ + public string Type { get; set; } = "heartbeat"; + public HeartbeatPayload Payload { get; set; } = new HeartbeatPayload(); +} + +public class HeartbeatPayload +{ + public string Message { get; set; } = "ping"; +} +``` + +### 序列化结果 +```json +{ + "type": "heartbeat", + "payload": { + "message": "ping" + } +} +``` \ No newline at end of file