v3.9.2026.0802 服务端请求处理全链路异步化,消除线程阻塞,提升高并发吞吐;新增 IAsyncApiHandler 标记接口,消除处理器路由反射;响应消息注入 TraceId,支持调用链追踪;节点在线与设备在线表新增登录时间字段;增强 WebSocket 心跳判死与会话管理机制;重构设备服务登录与在线持久化流程,统一长连接通知处理;优化 Headers 注入逻辑,避免数组/列表参数转换为字典导致数据丢失;修复客户端与通道代码缺陷,增强健壮性大石头 authored at 2026-08-02 01:01:05
diff --git a/Benchmark/NewLife.Remoting.Benchmarks.csproj b/Benchmark/NewLife.Remoting.Benchmarks.csproj
index 4adc26a..ad5ab1a 100644
--- a/Benchmark/NewLife.Remoting.Benchmarks.csproj
+++ b/Benchmark/NewLife.Remoting.Benchmarks.csproj
@@ -13,7 +13,7 @@
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
- <PackageReference Include="NewLife.Core" Version="11.17.2026.726-beta0124" />
+ <PackageReference Include="NewLife.Core" Version="11.18.2026.801" />
</ItemGroup>
<ItemGroup>
diff --git a/ChangeLog.md b/ChangeLog.md
index 3adeddd..ca0b1d8 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,35 @@
# 新生命远程通信库(NewLife.Remoting)变更日志
+## v3.9.2026.0802 (2026-08-02)
+
+### 性能优化
+- **服务端全链路异步化**:服务端请求处理全链路异步化,消除线程阻塞,提升高并发场景吞吐能力
+- **处理器路由反射消除**:新增 `IAsyncApiHandler` 标记接口,消除处理器路由反射,降低调用开销
+- **热路径性能优化**:优化热路径反射与模型绑定性能,移除接口实现类型静态缓存改为动态解析
+
+### 新功能
+- **TraceId 调用链追踪**:响应消息自动注入 TraceId,支持跨服务调用链追踪
+- **登录时间字段**:节点在线与设备在线表新增登录时间字段,便于在线状态审计
+
+### WebSocket 增强
+- **心跳判死优化**:优化 WebSocket 心跳判死机制与会话管理,提升连接稳定性
+- **断开日志降级**:WebSocket 正常断开异常从 Error 降为 Debug,减少误报警日志
+
+### 设备服务与在线管理
+- **在线记录优化**:在线记录长连接字段重命名与结算机制优化,统一长连接通知处理流程
+- **登录持久化统一**:重构设备登录与在线持久化流程,统一在 Login 方法执行,兼容不同 SessionID 字段命名
+- **控制器基类重构**:重构控制器基类依赖注入与构造逻辑,优化设备上下文 Online 获取方式
+
+### 客户端与健壮性
+- **客户端缺陷修复**:修复客户端与通道代码缺陷,优化连接池与异步调用,增强健壮性
+- **Upgrade 健壮性**:增强自动更新 `Upgrade.Run` 健壮性与路径处理
+- **Headers 注入优化**:优化 Headers 注入逻辑,避免数组/列表类型参数转换为字典导致数据丢失
+
+### 测试与质量
+- **测试扩展**:补充 CancellationToken 与设备控制器 HTTP 端点测试,同步测试计数至 631;统一测试用例端口复用配置;升级 ObjectPool 与 NewLife.* 依赖包版本
+
+---
+
## v3.8.2026.0706 (2026-07-06)
### RPC 流式调用增强
diff --git a/NewLife.Remoting.Extensions/NewLife.Remoting.Extensions.csproj b/NewLife.Remoting.Extensions/NewLife.Remoting.Extensions.csproj
index 5d4f38f..b6dbe73 100644
--- a/NewLife.Remoting.Extensions/NewLife.Remoting.Extensions.csproj
+++ b/NewLife.Remoting.Extensions/NewLife.Remoting.Extensions.csproj
@@ -7,7 +7,7 @@
<Description>提供设备接入控制器、令牌服务与会话管理扩展</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2026 NewLife</Copyright>
- <VersionPrefix>3.8</VersionPrefix>
+ <VersionPrefix>3.9</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
@@ -33,7 +33,7 @@
<RepositoryUrl>https://github.com/NewLifeX/NewLife.Remoting</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>新生命团队;X组件;NewLife;$(AssemblyName)</PackageTags>
- <PackageReleaseNotes>新增 Server-Streaming 流式调用与元数据透传,提升大规模数据推送效率;重构指令下发架构,支持响应总线与同步等待机制;支持 SSE 通道自动降级推送与 WebSocket 积压命令推送,增强推送兼容性;增强自动更新机制,支持冒烟测试、回滚与 Linux 兼容性;精简命令模型,移除持久化与重试实现,降低复杂度;修复设备控制器异常处理,优化客户端健壮性</PackageReleaseNotes>
+ <PackageReleaseNotes>服务端请求处理全链路异步化,消除线程阻塞,提升高并发吞吐;新增 IAsyncApiHandler 标记接口,消除处理器路由反射;响应消息注入 TraceId,支持调用链追踪;节点在线与设备在线表新增登录时间字段;增强 WebSocket 心跳判死与会话管理机制;重构设备服务登录与在线持久化流程,统一长连接通知处理;优化 Headers 注入逻辑,避免数组/列表参数转换为字典导致数据丢失;修复客户端与通道代码缺陷,增强健壮性</PackageReleaseNotes>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
diff --git a/NewLife.Remoting/NewLife.Remoting.csproj b/NewLife.Remoting/NewLife.Remoting.csproj
index e447ced..922b5ac 100644
--- a/NewLife.Remoting/NewLife.Remoting.csproj
+++ b/NewLife.Remoting/NewLife.Remoting.csproj
@@ -5,7 +5,7 @@
<Description>提供RPC、HTTP、WebSocket与SRMP统一通信能力</Description>
<Company>新生命开发团队</Company>
<Copyright>©2002-2026 新生命开发团队</Copyright>
- <VersionPrefix>3.8</VersionPrefix>
+ <VersionPrefix>3.9</VersionPrefix>
<VersionSuffix>$([System.DateTime]::Now.ToString(`yyyy.MMdd`))</VersionSuffix>
<Version>$(VersionPrefix).$(VersionSuffix)</Version>
<FileVersion>$(Version)</FileVersion>
@@ -30,7 +30,7 @@
<RepositoryUrl>https://github.com/NewLifeX/NewLife.Remoting</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>新生命团队;X组件;NewLife;$(AssemblyName)</PackageTags>
- <PackageReleaseNotes>新增 Server-Streaming 流式调用与元数据透传,提升大规模数据推送效率;重构指令下发架构,支持响应总线与同步等待机制;支持 SSE 通道自动降级推送与 WebSocket 积压命令推送,增强推送兼容性;增强自动更新机制,支持冒烟测试、回滚与 Linux 兼容性;精简命令模型,移除持久化与重试实现,降低复杂度;修复设备控制器异常处理,优化客户端健壮性</PackageReleaseNotes>
+ <PackageReleaseNotes>服务端请求处理全链路异步化,消除线程阻塞,提升高并发吞吐;新增 IAsyncApiHandler 标记接口,消除处理器路由反射;响应消息注入 TraceId,支持调用链追踪;节点在线与设备在线表新增登录时间字段;增强 WebSocket 心跳判死与会话管理机制;重构设备服务登录与在线持久化流程,统一长连接通知处理;优化 Headers 注入逻辑,避免数组/列表参数转换为字典导致数据丢失;修复客户端与通道代码缺陷,增强健壮性</PackageReleaseNotes>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
@@ -54,7 +54,7 @@
</ItemGroup>
<ItemGroup>
- <PackageReference Include="NewLife.Core" Version="11.17.2026.726-beta0124" />
+ <PackageReference Include="NewLife.Core" Version="11.18.2026.801" />
</ItemGroup>
<ItemGroup>
diff --git a/Readme.MD b/Readme.MD
index 97aabb2..85d4570 100644
--- a/Readme.MD
+++ b/Readme.MD
@@ -40,7 +40,7 @@ NewLife.Remoting 是 NewLife 技术栈的统一远程通信基础设施,由两
| 核心能力 | 说明 |
|:---------|------|
-| **RPC 核心框架** | SRMP 协议、JSON/二进制编解码、请求处理流水线、客户端/服务端、Cluster 连接管理、元数据传递、重试策略 |
+| **RPC 核心框架** | SRMP 协议、JSON/二进制编解码、请求处理流水线、客户端/服务端、Cluster 连接管理、元数据传递、重试策略、服务端全链路异步化、TraceId 调用链追踪 |
| **STRM 流式调用** | Server-Streaming:`IAsyncEnumerable<T>` 逐条推送,SRMP + SSE 双协议 |
| **CLNT 客户端基类** | 登录/心跳/升级/指令/事件一站式封装,WS/SSE 双通道自动切换 |
| **UPGD 自动更新** | 检测→下载→校验→解压→覆盖→重启全链路 |
diff --git a/Test/Test.csproj b/Test/Test.csproj
index 9e68230..befb3ff 100644
--- a/Test/Test.csproj
+++ b/Test/Test.csproj
@@ -12,7 +12,7 @@
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="NewLife.Core" Version="11.17.2026.726-beta0124" />
+ <PackageReference Include="NewLife.Core" Version="11.18.2026.801" />
</ItemGroup>
<ItemGroup>
diff --git a/XUnitTest/xunit.runsettings b/XUnitTest/xunit.runsettings
new file mode 100644
index 0000000..c3f090c
--- /dev/null
+++ b/XUnitTest/xunit.runsettings
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RunSettings>
+ <RunConfiguration>
+ <TestCaseFilter>FullyQualifiedName~XUnitTest</TestCaseFilter>
+ </RunConfiguration>
+ <xUnit>
+ <ParallelizeTestCollections>false</ParallelizeTestCollections>
+ <MaxParallelThreads>1</MaxParallelThreads>
+ </xUnit>
+</RunSettings>
diff --git a/XUnitTest/XUnitTest.csproj b/XUnitTest/XUnitTest.csproj
index 3786265..c292ed4 100644
--- a/XUnitTest/XUnitTest.csproj
+++ b/XUnitTest/XUnitTest.csproj
@@ -8,6 +8,8 @@
<SignAssembly>True</SignAssembly>
<AssemblyOriginatorKeyFile>..\Doc\newlife.snk</AssemblyOriginatorKeyFile>
<IsPackable>false</IsPackable>
+ <!-- 网络集成测试较多,限制并行度避免资源竞争导致偶发超时;配合 XUnitTest/xunit.runsettings -->
+ <RunSettingsFilePath>$(MSBuildProjectDirectory)\xunit.runsettings</RunSettingsFilePath>
<!-- 测试代码中大量使用 ? 注解但无可空上下文,统一抑制 CS8632 -->
<NoWarn>$(NoWarn);CS8632</NoWarn>
</PropertyGroup>
@@ -17,7 +19,7 @@
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.8.1" />
<PackageReference Include="NewLife.XCode" Version="12.0.2026.701" />
<PackageReference Include="Moq" Version="4.20.72" />
- <PackageReference Include="NewLife.Core" Version="11.17.2026.726-beta0124" />
+ <PackageReference Include="NewLife.Core" Version="11.18.2026.801" />
<PackageReference Include="NewLife.UnitTest" Version="1.1.2026.102" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">