v4.2.6
更新日期: 2026.4.25
更新描述:
修复性兼容性更新。
更新详情:
All
- 全库所有
PluginManager.RaiseAsync(typeof(IXxxPlugin), ...)调用统一替换为源生成扩展方法RaiseIXxxPluginAsync(...),涵盖 TCP/UDP/NamedPipe/SerialPort/Dmtp/Http/WebSocket/MQTT/WebApi 等全部组件。
TouchSocket
-
TouchSocketConfigExtension.SingleStreamDataHandlingAdapterProperty统一流式数据处理适配器配置属性,适用于 TCP、串口、命名管道等所有流式传输场景。 -
TouchSocketConfigExtension.TcpDataHandlingAdapterProperty标记为[Obsolete],内部委托到SingleStreamDataHandlingAdapterProperty;相应SetTcpDataHandlingAdapter/GetTcpDataHandlingAdapter扩展方法同步废弃。⚠️ 破坏性变更
TouchSocket.Core
-
WriterExtension.WriteNumberAsString<TWriter, TNumber>扩展方法:NET6+ 通过ISpanFormattable零堆分配将数值格式化为字符串写入字节流,低版本回退到一次string分配。 -
ReaderExtension.ReadNumberAsString<TReader, TNumber>扩展方法:NET7+ 通过ISpanParsable零堆分配从字节流解析数值字符串,低版本提供兼容实现。 -
IRequestInfoBuilder接口标记为[Obsolete(error)],由IBytesBuilder接口统一承接数据包构建职责。⚠️ 破坏性变更
TouchSocket.NamedPipe
-
NamedPipeConfigExtension.NamedPipeDataHandlingAdapterProperty标记为[Obsolete],内部委托到TouchSocketConfigExtension.SingleStreamDataHandlingAdapterProperty;相应SetNamedPipeDataHandlingAdapter/GetNamedPipeDataHandlingAdapter扩展方法同步废弃。⚠️ 破坏性变更
TouchSocket.SerialPorts
-
SerialPortConfigExtension.SerialDataHandlingAdapterProperty标记为[Obsolete],内部委托到TouchSocketConfigExtension.SingleStreamDataHandlingAdapterProperty;相应SetSerialDataHandlingAdapter/GetSerialDataHandlingAdapter扩展方法同步废弃。⚠️ 破坏性变更
TouchSocket.Http.WebSockets
-
WSDataFrame实现接口从IRequestInfoBuilder迁移到IBytesBuilder。⚠️ 破坏性变更
TouchSocket.Rpc
-
GeneratorRpcProxyAttribute从 Source Generator 动态注入迁移到TouchSocket.Rpc程序集中作为public正式类型,Source Generator 项目中的内联注入代码已删除。
TouchSocket.WebApi
-
WebApiProducesResponseTypeAttribute特性,用于在 WebApi 方法上显式声明 OpenAPI 响应类型,支持多状态码声明,适用于通过 AOP/过滤器修改实际返回值类型的场景。
TouchSocket.WebApi.Swagger
-
SwaggerOption.ConfigureOperation回调委托,在每个 WebApi 方法对应的OpenApiPathValue元数据生成完毕后触发,支持自定义修改标签、描述等元数据。 -
SwaggerPlugin.BuildResponse优先从[WebApiProducesResponseType]特性收集多状态码响应描述,无该特性时回退到方法声明的返回类型。 -
OpenApiContent、OpenApiDataTypes访问修饰符由internal改为public。
TouchSocket.Modbus
-
ModbusRtuRequest、ModbusTcpRequest实现接口从IRequestInfoBuilder迁移到IBytesBuilder。⚠️ 破坏性变更
TouchSocket.Mqtt
-
MqttSessionActor消息队列从System.Threading.Channels.Channel<T>迁移到Queue<DistributeMessage> + Lock + SemaphoreSlim方案,新增MessageCapacity(队列容量,默认 1000)和MessageExpiry(消息过期时间)配置属性,达到容量上限时触发MessageDiscarded回调而非静默丢弃。 -
MqttSessionActor.OfflineSince属性,记录会话下线的 UTC 时间;Activate/Deactivate同步维护在线/离线状态。 -
IMqttMessageDiscardedPlugin插件接口与MqttMessageDiscardedEventArgs事件参数,在会话消息因队列满(QueueFull)、消息过期(Expired)或发布失败(PublishFailed)被丢弃时触发。 -
DiscardReason枚举,标识消息被丢弃的原因:QueueFull/Expired/PublishFailed。 -
MqttBrokerOption配置类,包含MessageCapacity、MessageExpiry、SessionExpiry三项配置;MqttBroker.LoadConfig方法从配置对象批量初始化。 -
MqttConfigExtension.MqttBrokerOptionProperty(DependencyProperty),支持通过TouchSocketConfig统一注入 Broker 配置。 -
MqttBroker继承DisposableObject,新增SessionExpiry离线会话过期机制及内部定时清理器;开放AddSubscriber/RemoveSubscriber/ContainsSubscriber/GetSubscribers/GetAllTopics/ClearTopic/Clear等订阅管理 API。 -
MqttTcpService改为继承MqttTcpServiceBase,LoadConfig中自动读取MqttBrokerOptionProperty初始化 Broker。 -
MqttTcpServiceBase基类,统一 Mqtt TCP 服务的公共逻辑。 -
Subscription结构体访问修饰符由internal改为public,并补全 XML 文档。 -
MqttTcpSessionClient.MqttActor属性类型从MqttSessionActor收窄为MqttActor。 -
MqttBroker.RemoveMqttSessionActor方法参数从MqttSessionActor改为string(ClientId)。⚠️ 破坏性变更 -
MqttSessionActorResult结构体。⚠️ 破坏性变更 -
MqttWebSocketFeature实现ILoadedConfigPlugin,支持通过MqttBrokerOptionProperty注入 Broker 配置;内部 session 任务由Task.Run改为EasyTask.SafeNewRun。 -
MqttDisconnectMessage(V5)修复RemainingLength=0或1时解析器未处理省略 ReasonCode/Properties 的问题,符合 MQTT V5 规范。 -
MqttPubAckMessage(V5)修复序列化中条件判断取反导致 ReasonCode/Properties 写入逻辑异常的 Bug。 -
MqttMessage实现接口从IRequestInfoBuilder迁移到IBytesBuilder。⚠️ 破坏性变更
TouchSocketPro.Modbus
-
ModbusRtuResponseForSlave、ModbusTcpResponseForSlave实现接口从IRequestInfoBuilder迁移到IBytesBuilder。⚠️ 破坏性变更
TouchSocketPro.Dmtp
-
IRelayListener(基接口)、ITcpRelayListener、IUdpRelayListener接口,统一描述 TCP 与 UDP 中继监听器;对应实现TcpRelayListener/UdpRelayListener同步新增,原RelayPortListener重构为TcpRelayListener。 -
TcpRelayConnection/UdpRelayConnection,将原RelayConnection的 TCP/UDP 逻辑分别封装,链路抽象层次更清晰。
v4.2.4
更新日期: 2026.4.19
更新描述:
兼容性更新,主要针对 DMTP Relay 功能的增强与优化。
更新详情:
TouchSocketPro.Dmtp
-
RelayType枚举(Tcp/Udp)与RelayMode枚举(None/Tcp/Udp),用于区分中继链路类型及当前 Actor 工作模式。 -
UdpRelaySession:客户端侧 UDP 本地代理,绑定任意本地端口、将本地 UDP 数据包转发至中继服务端,并将服务端响应回写到原始发送端点。 -
RelayUdpListener(服务端 UDP 监听器)与RelayUdpRegistration(服务端 UDP 注册对象);RelayService新增独立的 UDP 双注册表(m_udpRegistrationsByRelayId/m_udpRegistrationsByRemoteIPHost)。 - 接口层次
IRelayRegistration(基接口)、ITcpRelayRegistration(含ConnectionCount)、IUdpRelayRegistration,统一表达 TCP 与 UDP 中继注册句柄。 -
IDmtpRelayUnregisteringPlugin插件接口与DmtpRelayUnregisteringEventArgs,支持在中继端口取消注册时触发插件回调,DmtpRelayFeature新增OnUnregisteringAsync委托并接入插件管道。 -
RelayPackageType:移除UnregisterTcpPort,新增RegisterUdpPort、UdpData、UnregisterById,统一以 ID 为维度取消注册。⚠️ 破坏性变更 -
IRelayService接口:新增RegisterUdpPortAsync、HandleUdpResponseAsync、TryGetRegistrationInfo、UnregisterByIdAsync,移除UnregisterPortAsync与HandleDmtpClosed。⚠️ 破坏性变更 -
RelayRegistration:移除WaitForRelayActorAsync/UnbindActor/TaskCompletionSource等待机制,改为TryGetRelayActor直接同步获取;Dmtp 未在线时RequestNewConnectionAsync/SendDataAsync立即返回失败。 -
DmtpRelayRegisteringEventArgs:新增RelayType属性,构造函数根据中继类型为Config设置ListenIPHosts(TCP)或BindIPHost(UDP)。 -
DmtpRelayFeature:移除IDmtpClosedPlugin实现,连接关闭逻辑由DmtpRelayActor自身处理;OnDmtpConnecting中调用NotifyConnecting,OnDmtpConnected中通过EasyTask.SafeRun异步调用NotifyConnectedAsync。 -
DmtpRelayActor:新增EnsureRegisteredAsync(注册信号量保护的幂等注册流程)、NotifyConnecting/NotifyConnectedAsync生命周期通知、RegisterUdpPortAsync/ForwardUdpDataAsync/SendUdpResponseAsyncUDP 数据路径,以及DisposeUdpSessions/GetOrCreateUdpSession会话管理。
TouchSocket.Core
-
WriterExtension中三个ReadOnlySpan<char>写入重载:WriteNormalString<TWriter>(ref TWriter, ReadOnlySpan<char>, Encoding)(无长度前缀)、WriteString<TWriter>(ref TWriter, ReadOnlySpan<char>, FixedHeaderType)(固定头部长度前缀)、WriteVarString<TWriter>(ref TWriter, ReadOnlySpan<char>)(变长编码长度前缀);全部采用分块写入并自适应翻倍 chunkSize,避免大字符串一次性分配大缓冲区。 -
WriterExtensionForClass:所有 class 版本扩展方法统一委托到对应的ref版本,消除重复的内联实现;新增WriteNormalString<TWriter>(this TWriter, ReadOnlySpan<char>, Encoding)class 版重载。 -
EncodingExtension扩展类(新文件)。
TouchSocket.Http
-
ServerHttpRequest内部属性InternalIsBodyConsumed、InternalBodyBytesRemaining、InternalIsChunkedBody,供HttpSessionClient在响应完成后判断 body 消费状态。 -
HttpSessionClient改进 body 消费与 keep-alive 处理策略:handler 未响应时兜底返回 404;chunked body 未消费直接断开;固定长度 body 剩余 ≤64KB 则 drain 后继续 keep-alive,>64KB 直接断开;KeepAlive 检查独立为第四阶段。
TouchSocket.WebApi
-
WebApiParserPlugin移除CloseClient私有方法及各响应路径中的 KeepAlive 主动关闭调用,keep-alive 生命周期由HttpSessionClient统一管理。
TouchSocket.Dmtp
-
HttpDmtpClient:SealedDmtpActor实例创建提前至OnDmtpConnecting阶段,重连后仅更新TransportWriter、MaxPackageSize、Logger、Client字段,避免重连时重复创建 actor 对象。
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>标签,补全缺失的文件末尾换行符,统一代码风格。