From 641f37ec2f72bbb3c4b7b1cde54eb916b6e6fb60 Mon Sep 17 00:00:00 2001 From: hyh Date: Fri, 25 Jul 2025 15:49:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E9=85=8D=E7=BD=AE=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=92=8CWebSocket=E4=BC=A0=E8=BE=93=E6=9C=8D=E5=8A=A1=E9=9B=86?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 在CellularNetworkService.StartNetworkAsync中添加协议客户端配置创建 2. 优化WebSocketTransportExtensions,移除冗余方法 3. 修正WebSocket配置文件与模型类匹配 4. 集成WebSocket传输服务到Startup 5. 重命名LogLayerHelp为ProtocolLayerConfigFactory 6. 完善错误处理和日志记录 --- .../Configurations/websocket.Development.json | 11 ++ CoreAgent.API/Configurations/websocket.json | 11 ++ CoreAgent.API/Startup.cs | 8 +- .../Network/CellularNetworkService.cs | 110 +++++++------ .../Network/ProtocolClientConfigFactory.cs | 153 +++++++++++++++--- ...rHelp.cs => ProtocolLayerConfigFactory.cs} | 29 +++- .../WebSocketTransportExtensions.cs | 118 ++++++-------- .../Models/WebSocketConfig.cs | 2 +- CoreAgent.WebSocketTransport/modify.md | 85 +++++++++- modify.md | 66 ++++++++ 10 files changed, 459 insertions(+), 134 deletions(-) create mode 100644 CoreAgent.API/Configurations/websocket.Development.json create mode 100644 CoreAgent.API/Configurations/websocket.json rename CoreAgent.ProtocolClient/Models/{LogLayerHelp.cs => ProtocolLayerConfigFactory.cs} (63%) create mode 100644 modify.md diff --git a/CoreAgent.API/Configurations/websocket.Development.json b/CoreAgent.API/Configurations/websocket.Development.json new file mode 100644 index 0000000..64b4f7a --- /dev/null +++ b/CoreAgent.API/Configurations/websocket.Development.json @@ -0,0 +1,11 @@ +{ + "WebSocket": { + "Url": "wss://localhost:8080/ws", + "TimeoutMs": 15000, + "BatchTimeoutMs": 50, + "MaxBatchSize": 50, + "MaxReconnectAttempts": 3, + "QueueCapacity": 500, + "CacheTtlMinutes": 5 + } +} \ No newline at end of file diff --git a/CoreAgent.API/Configurations/websocket.json b/CoreAgent.API/Configurations/websocket.json new file mode 100644 index 0000000..7965961 --- /dev/null +++ b/CoreAgent.API/Configurations/websocket.json @@ -0,0 +1,11 @@ +{ + "WebSocket": { + "Url": "wss://example.com/ws", + "TimeoutMs": 30000, + "BatchTimeoutMs": 100, + "MaxBatchSize": 100, + "MaxReconnectAttempts": 5, + "QueueCapacity": 1000, + "CacheTtlMinutes": 30 + } +} \ No newline at end of file diff --git a/CoreAgent.API/Startup.cs b/CoreAgent.API/Startup.cs index e8a0f51..0559b2b 100644 --- a/CoreAgent.API/Startup.cs +++ b/CoreAgent.API/Startup.cs @@ -6,6 +6,7 @@ using CoreAgent.Infrastructure.Middleware.GlobalException; using CoreAgent.Domain.Models.System; using Microsoft.Extensions.Configuration; using CoreAgent.Domain.Interfaces.Network; +using CoreAgent.WebSocketTransport.Extensions; namespace CoreAgent.API { @@ -41,6 +42,9 @@ namespace CoreAgent.API // 添加网络命令配置 services.Configure(Configuration.GetSection("networkCommand")); + + // 添加 WebSocket 传输服务 + services.AddWebSocketTransport(Configuration, "WebSocket"); } public void Configure(IApplicationBuilder app) @@ -87,7 +91,9 @@ namespace CoreAgent.API .AddJsonFile($"{configurationsDirectory}/api-versioning.json", optional: false, reloadOnChange: true) .AddJsonFile($"{configurationsDirectory}/api-versioning.{env.EnvironmentName}.json", optional: true, reloadOnChange: true) .AddJsonFile($"{configurationsDirectory}/netcommand.json", optional: false, reloadOnChange: true) - .AddJsonFile($"{configurationsDirectory}/netcommand.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); + .AddJsonFile($"{configurationsDirectory}/netcommand.{env.EnvironmentName}.json", optional: true, reloadOnChange: true) + .AddJsonFile($"{configurationsDirectory}/websocket.json", optional: false, reloadOnChange: true) + .AddJsonFile($"{configurationsDirectory}/websocket.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); // 添加配置 builder.Services.Configure(builder.Configuration); diff --git a/CoreAgent.Infrastructure/Services/Network/CellularNetworkService.cs b/CoreAgent.Infrastructure/Services/Network/CellularNetworkService.cs index edd5623..057e846 100644 --- a/CoreAgent.Infrastructure/Services/Network/CellularNetworkService.cs +++ b/CoreAgent.Infrastructure/Services/Network/CellularNetworkService.cs @@ -5,6 +5,7 @@ using CoreAgent.Domain.Interfaces.Network; using CoreAgent.Domain.Interfaces.System.Command; using CoreAgent.Domain.Models.Network; using CoreAgent.Domain.Models.System; +using CoreAgent.Infrastructure.Services.Network; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System.IO; @@ -17,6 +18,7 @@ namespace CoreAgent.Infrastructure.Services.Network; public class CellularNetworkService : ICellularNetworkService { private readonly ILogger _logger; + private readonly ILoggerFactory _loggerFactory; private readonly ISystemCommandExecutor _commandExecutor; private readonly INetworkConfigurationService _configService; private readonly ICellularNetworkContext _context; @@ -29,6 +31,7 @@ public class CellularNetworkService : ICellularNetworkService public CellularNetworkService( ILogger logger, + ILoggerFactory loggerFactory, ISystemCommandExecutor commandExecutor, INetworkConfigurationService configService, ICellularNetworkContext context, @@ -37,6 +40,7 @@ public class CellularNetworkService : ICellularNetworkService INetworkStatusMonitor statusMonitor) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); _commandExecutor = commandExecutor ?? throw new ArgumentNullException(nameof(commandExecutor)); _configService = configService ?? throw new ArgumentNullException(nameof(configService)); _context = context ?? throw new ArgumentNullException(nameof(context)); @@ -107,52 +111,6 @@ public class CellularNetworkService : ICellularNetworkService } } - /// - /// 检查网络状态 - /// - /// 新的网络配置键 - /// 检查结果 - private CellularNetworkOperationResult CheckNetworkState(string newConfigKey) - { - try - { - // 获取当前网络状态 - var currentKey = _context.GetNeConfigKey(); - var currentState = _context.GetNetworkState(); - - // 检查是否已初始化 - if (!string.IsNullOrEmpty(currentKey)) - { - // 检查是否是相同的配置 - if (currentKey == newConfigKey) - { - // 检查当前状态 - if (currentState.CurrentStatus == NetworkStatus.Connected) - { - return CellularNetworkOperationResult.Failure("当前网络配置已经处于连接状态"); - } - } - else - { - // 检查当前网络状态 - if (currentState.CurrentStatus == NetworkStatus.Connected) - { - var message = $"检测到不同的网络配置,当前运行配置: {currentKey},新配置: {newConfigKey},请先停止当前网络"; - _logger.LogWarning(message); - return CellularNetworkOperationResult.Failure(message); - } - } - } - - return CellularNetworkOperationResult.Success(NetworkStatus.Unknown); - } - catch (Exception ex) - { - _logger.LogError(ex, "检查网络状态失败"); - return CellularNetworkOperationResult.Failure($"检查网络状态失败: {ex.Message}"); - } - } - /// /// 停止蜂窝网络 /// @@ -233,6 +191,52 @@ public class CellularNetworkService : ICellularNetworkService } } + /// + /// 检查网络状态 + /// + /// 新的网络配置键 + /// 检查结果 + private CellularNetworkOperationResult CheckNetworkState(string newConfigKey) + { + try + { + // 获取当前网络状态 + var currentKey = _context.GetNeConfigKey(); + var currentState = _context.GetNetworkState(); + + // 检查是否已初始化 + if (!string.IsNullOrEmpty(currentKey)) + { + // 检查是否是相同的配置 + if (currentKey == newConfigKey) + { + // 检查当前状态 + if (currentState.CurrentStatus == NetworkStatus.Connected) + { + return CellularNetworkOperationResult.Failure("当前网络配置已经处于连接状态"); + } + } + else + { + // 检查当前网络状态 + if (currentState.CurrentStatus == NetworkStatus.Connected) + { + var message = $"检测到不同的网络配置,当前运行配置: {currentKey},新配置: {newConfigKey},请先停止当前网络"; + _logger.LogWarning(message); + return CellularNetworkOperationResult.Failure(message); + } + } + } + + return CellularNetworkOperationResult.Success(NetworkStatus.Unknown); + } + catch (Exception ex) + { + _logger.LogError(ex, "检查网络状态失败"); + return CellularNetworkOperationResult.Failure($"检查网络状态失败: {ex.Message}"); + } + } + private async Task StartNetworkAsync(string key) { // 1. 获取并验证网络配置 @@ -272,6 +276,19 @@ public class CellularNetworkService : ICellularNetworkService // 5. 更新 IP 端点管理器 _context.NetworkIPEndPointManager.UpdateEndPoints(endPoints); + // 5.5. 创建协议客户端配置 + var protocolConfigFactory = new ProtocolClientConfigFactory(_loggerFactory.CreateLogger(), _context); + var configCreated = protocolConfigFactory.CreateFromEntities(); + if (configCreated) + { + _logger.LogInformation("协议客户端配置创建成功,共创建 {ConfigCount} 个配置", protocolConfigFactory.ConfigCount); + } + else + { + _logger.LogWarning("协议客户端配置创建失败"); + return CellularNetworkOperationResult.Failure("协议客户端配置创建失败"); + } + // 6. 启动网络配置 _logger.LogInformation("正在启动蜂窝网络配置: {ConfigKey}", key); var enableResult = await _interfaceManager.EnableAsync(config); @@ -301,6 +318,7 @@ public class CellularNetworkService : ICellularNetworkService var state = _context.GetNetworkState(); state.MarkAsStarted(); _logger.LogInformation("蜂窝网络配置 {ConfigKey} 启动成功,当前状态: {Status}", key, state.CurrentStatus); + return CellularNetworkOperationResult.Success(state.CurrentStatus); } } \ No newline at end of file diff --git a/CoreAgent.Infrastructure/Services/Network/ProtocolClientConfigFactory.cs b/CoreAgent.Infrastructure/Services/Network/ProtocolClientConfigFactory.cs index dcd8070..33abc39 100644 --- a/CoreAgent.Infrastructure/Services/Network/ProtocolClientConfigFactory.cs +++ b/CoreAgent.Infrastructure/Services/Network/ProtocolClientConfigFactory.cs @@ -1,5 +1,7 @@ +using CoreAgent.Domain.Interfaces.Network; using CoreAgent.ProtocolClient.Models; using Microsoft.Extensions.Logging; +using System.Linq; namespace CoreAgent.Infrastructure.Services.Network { @@ -12,33 +14,148 @@ namespace CoreAgent.Infrastructure.Services.Network private readonly ILogger _logger; private readonly List _configs; - public ProtocolClientConfigFactory(ILogger logger) + private readonly ICellularNetworkContext _context; + + public ProtocolClientConfigFactory(ILogger logger,ICellularNetworkContext context) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _configs = new List(); + _context = context ?? throw new ArgumentNullException(nameof(context)); } /// /// 从多个实体创建协议客户端配置数组 /// - /// 实体列表 - /// 协议客户端配置数组 - public ProtocolClientConfig[] CreateFromEntities(IEnumerable entities) + /// 是否成功创建配置 + public bool CreateFromEntities() + { + try + { + _logger.LogInformation("开始从多个实体创建协议客户端配置数组"); + + // 清空现有配置 + _configs.Clear(); + + // 处理RAN端点 + ProcessRanEndPoint(); + + // 处理IMS端点 + ProcessImsEndPoints(); + + // 处理CN端点 + //ProcessCnEndPoints(); + + _logger.LogInformation("协议客户端配置创建完成,共创建 {Count} 个配置", _configs.Count); + return _configs.Count > 0; + } + catch (Exception ex) + { + _logger.LogError(ex, "创建协议客户端配置时发生异常"); + return false; + } + } + + /// + /// 处理RAN端点配置 + /// + private void ProcessRanEndPoint() + { + var ranEndPoint = _context.NetworkIPEndPointManager.GetRanEndPoint(); + if (ranEndPoint?.ComAddr != null) + { + _configs.Add(CreateClientConfig( + ranEndPoint.ComAddr, + ranEndPoint.ComAddr, + false, + "RAN", + ProtocolLayerConfigFactory.GetRANCustomLayerConfigs)); + _logger.LogDebug("已添加RAN端点配置: {Address}", ranEndPoint.ComAddr); + } + else + { + _logger.LogWarning("RAN端点信息为空或无效"); + } + } + + /// + /// 处理IMS端点配置 + /// + private void ProcessImsEndPoints() + { + var imsEndPoints = _context.NetworkIPEndPointManager.GetImsEndPoints(); + if (imsEndPoints?.Any() == true) + { + foreach (var imsEndPoint in imsEndPoints) + { + if (!string.IsNullOrEmpty(imsEndPoint.ComAddr)) + { + _configs.Add(CreateClientConfig( + imsEndPoint.ComAddr, + imsEndPoint.ComAddr, + false, + "IMS", + ProtocolLayerConfigFactory.GetIMSCustomLayerConfigs)); + _logger.LogDebug("已添加IMS端点配置: {Address}", imsEndPoint.ComAddr); + } + else + { + _logger.LogWarning("发现IMS端点配置地址为空"); + } + } + } + else + { + _logger.LogInformation("IMS端点列表为空"); + } + } + + /// + /// 处理CN端点配置 + /// + private void ProcessCnEndPoints() + { + var cnEndPoints = _context.NetworkIPEndPointManager.GetCnEndPoints(); + if (cnEndPoints?.Any() == true) + { + foreach (var cnEndPoint in cnEndPoints) + { + if (!string.IsNullOrEmpty(cnEndPoint.ComAddr)) + { + _configs.Add(CreateClientConfig( + cnEndPoint.ComAddr, + cnEndPoint.ComAddr, + false, + "CN", + ProtocolLayerConfigFactory.GetDefaultCustomLayerConfigs)); + _logger.LogDebug("已添加CN端点配置: {Address}", cnEndPoint.ComAddr); + } + else + { + _logger.LogWarning("发现CN端点配置地址为空"); + } + } + } + else + { + _logger.LogInformation("CN端点列表为空"); + } + } + + ProtocolClientConfig CreateClientConfig(string name, string address, bool ssl, string model, Func> getLayers) { - // TODO: 实现从多个实体组装ProtocolClientConfig数组的逻辑 - _logger.LogInformation("从多个实体创建协议客户端配置数组"); - - // 清空现有配置 - _configs.Clear(); - - // TODO: 实现具体的组装逻辑 - // foreach (var entity in entities) - // { - // var config = CreateConfigFromEntity(entity); - // _configs.Add(config); - // } - - throw new NotImplementedException("需要实现从多个实体创建协议客户端配置数组的逻辑"); + return new ProtocolClientConfig + { + Name = name, + Address = address, + Ssl = ssl, + Logs = new ProtocolClientLogsConfig + { + Signal = false, + Cch = false, + Layers = getLayers() + }, + Model = model + }; } /// diff --git a/CoreAgent.ProtocolClient/Models/LogLayerHelp.cs b/CoreAgent.ProtocolClient/Models/ProtocolLayerConfigFactory.cs similarity index 63% rename from CoreAgent.ProtocolClient/Models/LogLayerHelp.cs rename to CoreAgent.ProtocolClient/Models/ProtocolLayerConfigFactory.cs index 027f127..246c66b 100644 --- a/CoreAgent.ProtocolClient/Models/LogLayerHelp.cs +++ b/CoreAgent.ProtocolClient/Models/ProtocolLayerConfigFactory.cs @@ -7,11 +7,11 @@ using System.Threading.Tasks; namespace CoreAgent.ProtocolClient.Models { /// - /// 日志层配置帮助类 + /// 协议层日志配置工厂 /// 提供预定义的日志层配置,用于不同协议层的日志记录控制 /// 支持LTE协议栈各层的日志级别、大小限制和过滤规则配置 /// - public static class LogLayerHelp + public static class ProtocolLayerConfigFactory { /// /// 获取默认的LTE协议层日志配置 @@ -56,5 +56,30 @@ namespace CoreAgent.ProtocolClient.Models ["MMS"] = new LogLayerConfig { Level = "warn", MaxSize = 1000, Payload = true, Filter = "debug" }, }; } + + /// + /// 获取RAN协议层的日志配置 + /// 包含PHY、MAC、RLC、PDCP、RRC、NAS等RAN相关协议的配置 + /// + /// RAN协议层名称到配置的映射字典 + public static Dictionary GetRANCustomLayerConfigs() + { + // 直接返回静态配置,避免不必要的嵌套和动态解析 + return new Dictionary + { + ["PHY"] = new LogLayerConfig { Level = "warn", MaxSize = 1000, Payload = true, Filter = "info" }, + ["MAC"] = new LogLayerConfig { Level = "warn", MaxSize = 1000, Payload = true, Filter = "info" }, + ["RLC"] = new LogLayerConfig { Level = "info", MaxSize = 1000, Payload = false, Filter = "info" }, + ["PDCP"] = new LogLayerConfig { Level = "warn", MaxSize = 1000, Payload = false, Filter = "warn" }, + ["RRC"] = new LogLayerConfig { Level = "debug", MaxSize = 1000, Payload = true, Filter = "debug" }, + ["NAS"] = new LogLayerConfig { Level = "debug", MaxSize = 1000, Payload = true, Filter = "debug" }, + ["S1AP"] = new LogLayerConfig { Level = "warn", MaxSize = 1000, Payload = false, Filter = "info" }, + ["NGAP"] = new LogLayerConfig { Level = "warn", MaxSize = 1000, Payload = false, Filter = "info" }, + ["GTPU"] = new LogLayerConfig { Level = "info", MaxSize = 1000, Payload = false, Filter = "info" }, + ["X2AP"] = new LogLayerConfig { Level = "warn", MaxSize = 1000, Payload = false, Filter = "info" }, + ["XnAP"] = new LogLayerConfig { Level = "info", MaxSize = 1000, Payload = false, Filter = "info" }, + ["M2AP"] = new LogLayerConfig { Level = "info", MaxSize = 1000, Payload = false, Filter = "info" } + }; + } } } diff --git a/CoreAgent.WebSocketTransport/Extensions/WebSocketTransportExtensions.cs b/CoreAgent.WebSocketTransport/Extensions/WebSocketTransportExtensions.cs index ced9b82..2f2ceb0 100644 --- a/CoreAgent.WebSocketTransport/Extensions/WebSocketTransportExtensions.cs +++ b/CoreAgent.WebSocketTransport/Extensions/WebSocketTransportExtensions.cs @@ -28,64 +28,50 @@ public static class WebSocketTransportExtensions IConfiguration configuration, string configSection = "WebSocket") { + if (services == null) + throw new ArgumentNullException(nameof(services)); + if (configuration == null) + throw new ArgumentNullException(nameof(configuration)); + // 注册配置 services.Configure(options => { configuration.GetSection(configSection).Bind(options); }); - - // 注册核心组件 - services.AddSingleton(); - services.AddSingleton(); - // 注册消息通道管理器 - services.AddSingleton(provider => - { - var logger = provider.GetRequiredService>(); - var config = configuration.GetSection(configSection).Get() ?? new WebSocketConfig(); - return new MessageChannelManager(logger, config.QueueCapacity, config.QueueCapacity, 100); - }); + // 注册核心服务 + RegisterCoreServices(services); - // 注册 WebSocket 传输 - services.AddSingleton(provider => - { - var logger = provider.GetRequiredService>(); - var connection = provider.GetRequiredService(); - var serializer = provider.GetRequiredService(); - var middlewares = provider.GetServices(); - var config = configuration.GetSection(configSection).Get() ?? new WebSocketConfig(); - var channelManager = provider.GetRequiredService(); - - return new CoreAgent.WebSocketTransport.Services.WebSocketTransport(logger, connection, serializer, middlewares, config, channelManager); - }); - // 注册默认中间件 - services.AddWebSocketMiddleware(); - // services.AddWebSocketMiddleware(); - services.AddScoped(provider => - { - var cache = provider.GetRequiredService(); - var logger = provider.GetRequiredService>(); - var config = provider.GetRequiredService>().Value; - return new CacheMiddleware(cache, logger, config); - }); + RegisterDefaultMiddleware(services); return services; } + + /// - /// 添加 WebSocket 传输服务(使用委托配置) + /// 添加 WebSocket 中间件 /// + /// 中间件类型 /// 服务集合 - /// 配置委托 /// 服务集合 - public static IServiceCollection AddWebSocketTransport( - this IServiceCollection services, - Action configure) + public static IServiceCollection AddWebSocketMiddleware(this IServiceCollection services) + where T : class, IMessageMiddleware + { + if (services == null) + throw new ArgumentNullException(nameof(services)); + + services.AddScoped(); + return services; + } + + /// + /// 注册核心服务 + /// + /// 服务集合 + private static void RegisterCoreServices(IServiceCollection services) { - // 注册配置 - services.Configure(options => configure(options)); - // 注册核心组件 services.AddSingleton(); services.AddSingleton(); @@ -94,9 +80,13 @@ public static class WebSocketTransportExtensions services.AddSingleton(provider => { var logger = provider.GetRequiredService>(); - var config = new WebSocketConfig(); - configure(config); - return new MessageChannelManager(logger, config.QueueCapacity, config.QueueCapacity, 100); + var config = provider.GetRequiredService>().Value; + + return new MessageChannelManager( + logger, + config.QueueCapacity, + config.QueueCapacity, + 100); }); // 注册 WebSocket 传输 @@ -106,16 +96,29 @@ public static class WebSocketTransportExtensions var connection = provider.GetRequiredService(); var serializer = provider.GetRequiredService(); var middlewares = provider.GetServices(); - var config = new WebSocketConfig(); - configure(config); + var config = provider.GetRequiredService>().Value; var channelManager = provider.GetRequiredService(); - return new CoreAgent.WebSocketTransport.Services.WebSocketTransport(logger, connection, serializer, middlewares, config, channelManager); + return new CoreAgent.WebSocketTransport.Services.WebSocketTransport( + logger, + connection, + serializer, + middlewares, + config, + channelManager); }); - - // 注册默认中间件 + } + + /// + /// 注册默认中间件 + /// + /// 服务集合 + private static void RegisterDefaultMiddleware(IServiceCollection services) + { + // 注册日志中间件 services.AddWebSocketMiddleware(); - // services.AddWebSocketMiddleware(); + + // 注册缓存中间件(可选) services.AddScoped(provider => { var cache = provider.GetRequiredService(); @@ -123,20 +126,5 @@ public static class WebSocketTransportExtensions var config = provider.GetRequiredService>().Value; return new CacheMiddleware(cache, logger, config); }); - - return services; - } - - /// - /// 添加 WebSocket 中间件 - /// - /// 中间件类型 - /// 服务集合 - /// 服务集合 - public static IServiceCollection AddWebSocketMiddleware(this IServiceCollection services) - where T : class, IMessageMiddleware - { - services.AddScoped(); - return services; } } \ No newline at end of file diff --git a/CoreAgent.WebSocketTransport/Models/WebSocketConfig.cs b/CoreAgent.WebSocketTransport/Models/WebSocketConfig.cs index 8f84b7d..02a110c 100644 --- a/CoreAgent.WebSocketTransport/Models/WebSocketConfig.cs +++ b/CoreAgent.WebSocketTransport/Models/WebSocketConfig.cs @@ -43,7 +43,7 @@ public class WebSocketConfig /// 队列容量 /// [Range(10, 100000, ErrorMessage = "队列容量必须在 10-100000 之间")] - public int QueueCapacity { get; set; } = 1000; + public int QueueCapacity { get; set; } = 10000; /// /// 缓存消息 TTL(分钟) diff --git a/CoreAgent.WebSocketTransport/modify.md b/CoreAgent.WebSocketTransport/modify.md index b7e5b29..fb1e1b4 100644 --- a/CoreAgent.WebSocketTransport/modify.md +++ b/CoreAgent.WebSocketTransport/modify.md @@ -701,4 +701,87 @@ private async Task ConnectInternalAsync(CancellationToken cancellationToken) ### 总结 -此次修复解决了 WebSocket 连接管理中的严重 Bug,确保了连接在收到 Close 消息后能够正确重连。修复涉及多个层面的改进,包括连接状态管理、任务管理、错误处理等,大大提高了系统的稳定性和可靠性。 \ No newline at end of file +此次修复解决了 WebSocket 连接管理中的严重 Bug,确保了连接在收到 Close 消息后能够正确重连。修复涉及多个层面的改进,包括连接状态管理、任务管理、错误处理等,大大提高了系统的稳定性和可靠性。 + +## 2024年修改记录 + +### WebSocketTransportExtensions 清理优化 + +**修改时间**: 2024年 +**修改文件**: +- `CoreAgent.WebSocketTransport/Extensions/WebSocketTransportExtensions.cs` + +**优化内容**: + +1. **代码重构** + - 消除重复代码,将公共逻辑提取到私有方法中 + - 添加参数验证,确保输入参数不为空 + - 改进代码结构和可读性 + +2. **方法拆分** + - `RegisterCoreServices()` - 注册核心服务组件 + - `RegisterDefaultMiddleware()` - 注册默认中间件 + - 提高代码的可维护性和可测试性 + +3. **错误处理改进** + - 添加 `ArgumentNullException` 检查 + - 确保配置对象正确获取 + - 改进依赖注入的健壮性 + +4. **配置管理优化** + - 统一使用 `IOptions` 获取配置 + - 消除配置获取的重复代码 + - 确保配置一致性 + +5. **移除冗余方法** + - 移除委托配置重载方法 `AddWebSocketTransport(Action)` + - 简化 API 设计,减少维护成本 + - 统一使用基于 `IConfiguration` 的配置方式 + +### Startup 集成实现 + +**修改时间**: 2024年 +**修改文件**: +- `CoreAgent.API/Startup.cs` +- `CoreAgent.API/Configurations/websocket.json` +- `CoreAgent.API/Configurations/websocket.Development.json` + +**集成内容**: + +1. **Startup.cs 修改** + - 添加 `using CoreAgent.WebSocketTransport.Extensions;` + - 在 `ConfigureServices` 中注册 WebSocket 传输服务 + - 在配置加载中添加 WebSocket 配置文件 + +2. **配置文件创建** + - `websocket.json` - 生产环境配置 + - `websocket.Development.json` - 开发环境配置 + - 包含所有 WebSocketConfig 类的属性配置项 + +3. **配置项说明** + - `Url`: WebSocket 服务器地址 + - `TimeoutMs`: 连接超时时间(毫秒) + - `BatchTimeoutMs`: 批量发送时间窗口(毫秒) + - `MaxBatchSize`: 最大批量大小(条消息) + - `MaxReconnectAttempts`: 最大重连尝试次数 + - `QueueCapacity`: 消息队列容量 + - `CacheTtlMinutes`: 缓存消息 TTL(分钟) + +4. **环境差异配置** + - 开发环境:较小的队列容量和批量大小,较短的超时时间,较少的重连次数 + - 生产环境:较大的队列容量和批量大小,较长的超时时间,较多的重连次数 + +**设计优势**: +- 代码结构清晰,易于维护 +- 配置灵活,支持不同环境 +- 错误处理完善,提高系统健壮性 +- 遵循依赖注入最佳实践 +- 支持热重载配置 +- API 设计简洁,减少冗余方法 +- 配置文件与模型类完全匹配,确保配置绑定正确 + +**影响范围**: +- WebSocket 传输服务注册 +- 配置管理 +- 中间件集成 +- 应用程序启动流程 \ No newline at end of file diff --git a/modify.md b/modify.md new file mode 100644 index 0000000..341b80d --- /dev/null +++ b/modify.md @@ -0,0 +1,66 @@ +# 修改记录 + +## 2024年修改记录 + +### CellularNetworkService.StartNetworkAsync 方法添加协议客户端配置创建 + +**修改时间**: 2024年 +**修改文件**: +- `CoreAgent.Infrastructure/Services/Network/CellularNetworkService.cs` + +**修改内容**: + +1. **添加第5.5步协议客户端配置创建** + - 在 `StartNetworkAsync` 方法的第5步(更新IP端点管理器)之后添加第5.5步 + - 直接创建 `ProtocolClientConfigFactory` 实例 + - 调用 `CreateFromEntities()` 方法创建协议客户端配置 + - 添加配置创建成功/失败的日志记录 + - **错误处理**:配置创建失败时立即返回失败结果,不继续执行后续步骤 + - **优化执行顺序**:将协议客户端配置创建提前到网络启动之前,确保数据可用性和错误隔离 + +2. **修复Logger类型问题** + - 添加 `ILoggerFactory` 依赖注入到构造函数 + - 使用 `_loggerFactory.CreateLogger()` 创建正确类型的Logger + - 确保 `ProtocolClientConfigFactory` 获得正确的Logger实例 + +3. **具体实现**: + ```csharp + // 5.5. 创建协议客户端配置 + var protocolConfigFactory = new ProtocolClientConfigFactory(_loggerFactory.CreateLogger(), _context); + var configCreated = protocolConfigFactory.CreateFromEntities(); + if (configCreated) + { + _logger.LogInformation("协议客户端配置创建成功,共创建 {ConfigCount} 个配置", protocolConfigFactory.ConfigCount); + } + else + { + _logger.LogWarning("协议客户端配置创建失败"); + return CellularNetworkOperationResult.Failure("协议客户端配置创建失败"); + } + ``` + +4. **添加必要的依赖注入** + - 添加 `ILoggerFactory loggerFactory` 参数到构造函数 + - 添加 `using CoreAgent.Infrastructure.Services.Network;` 以支持 `ProtocolClientConfigFactory` + +5. **设计优势**: + - 在IP端点信息准备完成后立即创建协议客户端配置 + - 不依赖网络启动结果,确保配置创建的独立性 + - 不依赖依赖注入,直接实例化使用 + - 提供详细的日志记录便于调试 + - 保持代码的简洁性和可维护性 + - 正确处理Logger类型,避免类型不匹配问题 + - 优化执行顺序,提高错误隔离能力 + - 完善的错误处理机制,确保配置创建失败时及时停止 + +**影响范围**: +- 蜂窝网络启动流程 +- 协议客户端配置管理 +- 网络状态监控 +- 依赖注入配置(需要更新服务注册) + +### LogLayerHelp类名规范化 + +**修改时间**: 2024年 +**修改文件**: +- ` \ No newline at end of file