v4.2.2(3)
更新日期: 2026.4.11
更新描述:
- DMTP Relay 注册与重连机制重构:TouchSocketPro.Dmtp 的 Relay 功能引入
RelayId作为稳定标识,服务端新增RelayRegistration注册模型统一管理监听器与 Actor 绑定;Relay 客户端在 DMTP 重连后可自动等待上线并续约端口映射,IRelayService接口同步升级为基于RelayId/地址的签名。⚠️ 破坏性变更 - PLC Operator 类型桥接新增:TouchSocketPro.PlcBridges 新增
IPlcOperator.As<TValueSource, TValueTarget>系列扩展和PlcOperatorAsWrapper,支持在不同 PLC 值类型之间按字节级别复用同一个操作器,并可控制统一或分别指定源/目标字节序。 - PLC 同步写入扩展移除:
IPlcOperatorExtension.Write<TValue, TWritableValue>同步扩展方法已删除,公共 API 仅保留异步写入路径。⚠️ 破坏性变更 - Modbus 输入寄存器读取修复:
ModbusInputRegistersDrive读取输入寄存器时改用正确的StartingAddress字段构造请求,修复错误地址字段导致的读输入寄存器异常。
更新详情:
TouchSocketPro.Dmtp
-
DmtpRelayPackage、RelayClientOption、RelayResponse全面引入RelayId,DmtpRelayActor改为同时维护RelayId -> InternalRelayClient与RemoteIPHost -> RelayId双索引;所有注册、建链、数据、断链包统一携带RelayId、LocalIPHost、RemoteIPHost,中继路由不再仅依赖RemoteIPHost。 -
RelayService引入RelayRegistration注册对象统一管理监听器、IDmtpActor绑定和连接状态;RegisterPortAsync、UnregisterPortAsync、HandleReceivedDataAsync、HandleConnectionClosedAsync全部升级为RelayId感知接口,并新增HandleDmtpClosed。⚠️ 破坏性变更 -
DmtpRelayFeature新增IDmtpConnectedPlugin与IDmtpClosedPlugin生命周期处理;DmtpRelayActor在连接建立后自动续约已有中继,在连接关闭时重置在线等待状态并通知RelayService解绑 Actor。 -
InternalRelayClient引入注册信号量、关闭令牌、一次性注销状态控制和EnsureRegisteredAsync流程;RelayConnection在本地连接关闭时会主动同步远端关闭事件,在服务端主动关闭时通过CloseFromServerAsync避免重复回流,提升端口映射长连接场景的稳定性。 -
DmtpRelayActor现在对未配置IRelayService、未提供注册回调、重复添加中继客户端、注册失败回滚等场景具备完整保护,避免异常时残留无效中继状态。
TouchSocketPro.PlcBridges
-
IPlcOperatorExtension新增As<TValueSource, TValueTarget>三个扩展重载,支持默认字节序、统一字节序或分别指定源/目标字节序。 -
PlcOperatorAsWrapper<TValueSource, TValueTarget>适配器,可将IPlcOperator<TValueSource>包装为IPlcOperator<TValueTarget>;读取时按长度换算并完成类型转换,写入时反向转换后透传到底层 Operator,实现不同 PLC 值类型之间的无缝桥接。 -
IPlcOperatorExtension.Write<TValue, TWritableValue>同步扩展方法已删除,公共 API 仅保留异步写入路径。⚠️ 破坏性变更
TouchSocketPro.Modbus
-
ModbusInputRegistersDrive.ExecuteReadAsync构造ModbusRequest时将输入寄存器读取地址字段从ReadStartAddress更正为StartingAddress,修复读取输入寄存器时请求地址写入错误的问题。
v4.2.1
更新日期: 2026.4.4
更新描述:
- Modbus 功能码处理器注册表架构重构:引入
ModbusFunctionHandlerRegistry可扩展功能码处理器注册机制,彻底替代原有的 if-else 功能码分支逻辑;所有 Modbus 主站组件均暴露FunctionHandlerRegistry属性,支持自定义扩展功能码;适配器与请求/响应对象统一通过注册表委派 PDU 构建与解析;ModbusRtuAdapter/ModbusUdpRtuAdapter使用ArrayPool<byte>.Shared避免解析时堆内存分配。 - 发送逻辑代码注入统一化:
TcpClientBase新增ProtectedSendAsync<TRequestInfoBuilder>泛型方法,通过CodeInject.RegionInject将发送逻辑统一注入TcpSessionClientBase、NamedPipeClientBase、NamedPipeSessionClientBase、SerialPortClientBase,消除各客户端组件中大量重复发送代码。 - HTTP Header 重复写入修复:
HttpBase中ContentLength/ContentType/TransferEncoding属性赋值改用索引器替代Add/AddInternal,防止重复设置时产生重复 Header 条目;新增Content-Type快路径解析分支。 - DmtpRpcActor 内存分配优化:移除临时
ValueByteBlock分配,直接调用DmtpActor.SendAsync(token, IPackage)重载,降低内存分配和代码复杂度。 - ReconnectionOptionsExtension 参数语义调整:
UseDmtpCheckAction参数pingTimeout重命名为pingInterval,语义变更为"相邻两次 Ping 之间的最小间隔"。⚠️ 破坏性变更 - WebApi ContentType 设置行为修正:
WebApiParserPlugin仅在用户未显式设置ContentType时才应用框架默认值,允许 Action 方法自定义响应Content-Type。 - 并发 RPC 调度修复:
ConcurrencyRpcDispatcher将EasyTask.SafeRun改为EasyTask.SafeNewRun,修复高并发下 RPC 调用的线程调度问题。
更新详情:
TouchSocket
-
TcpClientBase新增ProtectedSendAsync<TRequestInfoBuilder>泛型方法,通过CodeInject.RegionInject机制将统一的发送逻辑注入到TcpSessionClientBase、NamedPipeClientBase、NamedPipeSessionClientBase、SerialPortClientBase,消除各组件中大量重复的#region 发送与#region Throw代码块。
TouchSocket.Http
-
HttpBase中ContentLength、ContentType、TransferEncoding属性赋值改用索引器(m_headers[key] = value)替代Add/AddInternal,修复对同一 Header 多次赋值时产生重复条目的问题。 -
HttpBase.OnParsingHeader新增Content-Type请求头的专项快路径解析分支,提高高频请求场景下的 Header 解析效率。
TouchSocket.Dmtp
-
DmtpRpcActor.InvokeThisAsync移除两处临时ValueByteBlock分配,直接调用DmtpActor.SendAsync(token, IPackage)重载完成 RPC 响应包的打包与发送,降低 GC 压力并简化代码路径。 -
ReconnectionOptionsExtension.UseDmtpCheckAction参数pingTimeout重命名为pingInterval,语义由"单次 Ping 操作超时"变更为"相邻两次 Ping 之间的最小间隔时间";内部 Ping 操作超时保持固定 5s。⚠️ 破坏性变更
TouchSocket.Rpc
-
ConcurrencyRpcDispatcher将EasyTask.SafeRun改为EasyTask.SafeNewRun,修复高并发场景下多个 RPC 并发调用时可能出现的线程调度竞争问题。
TouchSocket.WebApi
-
WebApiParserPlugin将ContentType赋值由无条件覆盖改为判断httpResponse.ContentType.IsEmpty后才写入框架默认值,允许 Action 方法在返回前显式设置自定义Content-Type不被框架覆盖。
TouchSocket.Modbus
- 引入
ModbusFunctionHandlerRegistry可扩展功能码处理器注册表,彻底替代ModbusRtuAdapter、ModbusUdpRtuAdapter、ModbusTcpAdapterForPoll、ModbusUdpAdapter、ModbusRtuRequest、ModbusTcpRequest、ModbusTcpResponse中原有的 if-else 功能码硬编码分支。 - 所有 Modbus 主站组件(
ModbusRtuMaster、ModbusRtuOverTcpMaster、ModbusRtuOverUdpMaster、ModbusTcpMaster、ModbusUdpMaster)新增FunctionHandlerRegistry属性(默认使用ModbusFunctionHandlerRegistry.Default),支持注册自定义功能码处理器实现协议扩展。 -
ModbusRtuAdapter与ModbusUdpRtuAdapter解析响应时改用ArrayPool<byte>.Shared租借临时缓冲区,避免频繁的堆内存分配。 -
ModbusTcpRequest.MaxLength从 1024 扩展至 2048,以支持更大负载的 Modbus TCP 请求帧。 -
ModbusTcpMaster移除冗余的m_semaphoreForConnect字段。
v4.2.0
更新日期: 2026.3.29
更新描述:
- ClosedEventArgs 重构:移除
Manual(bool)属性,新增Exception属性(携带导致连接关闭的异常对象);构造函数从ClosedEventArgs(bool manual, string mes)拆分为ClosedEventArgs(string mes)与ClosedEventArgs(string mes, Exception exception)两个重载,TcpTransport、BaseTransport、StreamTransport同步适配。⚠️ 破坏性变更 - TcpTransport 发送管道完善:接收循环退出时额外调用
m_pipeSend.Writer.Complete(),确保连接关闭后任何挂起或后续的写入操作立即抛出异常,而非静默"成功"。 - StaticFilesPool 按需加载(On-Demand Loading):
TryFindEntry缓存未命中时,自动在受监控的文件夹中按 URL 键反向解析物理路径并即时加载入缓存;内置路径安全校验,防止路径遍历攻击。 - AOT 支持增强:
ClassCodeGenerator.AddTypeString补充[RequiresDynamicCode]特性;SwaggerPlugin多处反射/动态代码方法添加[UnconditionalSuppressMessage]抑制 AOT 警告;源生成器项目统一配置<NoWarn>消除编译器警告。 - 全局代码规范化:大规模清理 XML 文档中冗余的
<param>/<returns>标签,补全缺失的文件末尾换行符;移除TcpClientBase中遗留的临时调试日志语句。 - DMTP不兼容更新:Dmtp协议包中新增
Version属性,标识协议版本号;协议解析器适配新版本格式,旧版本协议将无法被新解析器识别。⚠️ 破坏性变更
更新详情:
TouchSocket
-
ClosedEventArgs构造函数重构:移除ClosedEventArgs(bool manual, string mes)重载,改为ClosedEventArgs(string mes)(正常关闭)与ClosedEventArgs(string mes, Exception exception)(异常关闭,携带原始异常对象);同步移除Manual(bool)属性,新增Exception属性。⚠️ 破坏性变更 -
TcpTransport.RunReceive接收循环退出的finally块中,在pipeReader.Complete()之后额外调用m_pipeSend.Writer.Complete(),确保连接关闭后任何对写入管道的FlushAsync操作立即失败,防止调用方误认为发送成功。 -
TcpClientBase移除RunSessionAsync、CloseAsync、ReceiveLoopAsync等方法中遗留的临时调试日志([TcpDebug]系列Logger.Debug输出),减少运行时日志噪声。
TouchSocket.Http
-
StaticFilesPool.TryFindEntry在缓存未命中时,调用内部方法TryLoadOnDemand遍历受监控的文件夹,根据 URL 键反向解析物理文件路径并按需加载入缓存;TryResolvePhysicalPath包含完整的路径安全校验(Root 边界检查),防止路径遍历攻击。 -
FolderEntry.AddKeyToDirectory方法,支持在StaticFilesPool写锁保护下向指定目录的跟踪集合追加单个 URL 键。 -
TryFindEntry对 URL 键统一规范化处理,确保以/开头,提高路径匹配一致性。
TouchSocket.Rpc
-
ClassCodeGenerator.AddTypeString及相关私有方法补充[RequiresDynamicCode]特性,与已有的[RequiresUnreferencedCode]配合,完善 AOT 兼容性标注。
TouchSocket.WebApi.Swagger
-
SwaggerPlugin的AddSchemaType、CreateSchema、GetComponents方法添加[UnconditionalSuppressMessage]特性,抑制裁剪/AOT 分析器警告;csproj新增<NoWarn>SYSLIB1034</NoWarn>消除编译器诊断。
TouchSocket.Dmtp
TouchSocket.Mqtt
All
- 大规模清理全库 XML 文档注释中冗余的
<param>/<returns>标签,补全缺失的文件末尾换行符,统一代码风格。