NewLife/NewLife.Remoting

v3.7.2026.0201 ApiServer支持动态端口分配;修正证书密钥赋值错误;优化OAuth异常处理;增强HttpMessage解析兼容性;提升单元测试稳定性
大石头 authored at 2026-02-01 10:42:35
c597595
Tree
1 Parent(s) 0bd5ee8
Summary: 9 changed files with 601 additions and 19 deletions.
Added +506 -0
Added +76 -0
Modified +3 -3
Modified +3 -3
Modified +4 -4
Modified +3 -3
Modified +4 -4
Modified +1 -1
Modified +1 -1
Added +506 -0
diff --git a/.github/instructions/xcode.instructions.md b/.github/instructions/xcode.instructions.md
new file mode 100644
index 0000000..dcd5984
--- /dev/null
+++ b/.github/instructions/xcode.instructions.md
@@ -0,0 +1,506 @@
+# XCode 协作指令
+
+本指令面向新生命团队(NewLife)开源数据中间件 XCode,帮助 Copilot 在 .NET 项目中正确使用 XCode 进行数据建模和实体操作。
+
+---
+
+## 1. XCode 定位与边界
+
+### 1.1 技术栈定位
+
+```
+NewLife.Core(基础库)
+       ↓
+   NewLife.XCode(数据中间件)← 本指令
+       ↓
+   NewLife.Cube(Web 快速开发框架)→ cube.instructions.md
+```
+
+### 1.2 职责边界
+
+| 层级 | 职责 | 指令文件 |
+|------|------|---------|
+| **NewLife.Core** | 基础扩展、日志、缓存、网络等 | `copilot-instructions.md` |
+| **NewLife.XCode** | 数据建模、ORM、实体增删改查、数据库操作 | 本指令 |
+| **NewLife.Cube** | Web 管理后台、控制器、视图、权限 | `cube.instructions.md` |
+
+### 1.3 本指令覆盖范围
+
+**包含**:
+- 数据模型设计(Model.xml)
+- 实体类生成与使用
+- 数据库 CRUD 操作
+- 项目初始化与 XCode 接入
+
+**不包含**(由 cube.instructions.md 负责):
+- Web 控制器逻辑
+- 视图与前端交互
+- 权限管理配置
+- 魔方区域深度定制
+
+---
+
+## 2. 使用场景与快速入口
+
+### 2.1 场景一:已有项目接入 XCode
+
+1. 引入 NuGet 包:`dotnet add package NewLife.XCode`
+2. 创建或编辑 `Model.xml` 进行数据建模
+3. 执行 `xcode` 命令生成实体类
+4. 在业务代码中使用实体类进行数据操作
+
+### 2.2 场景二:从零创建新项目
+
+1. 安装模板:`dotnet new install NewLife.Templates`
+2. 创建数据类库:`dotnet new xcode -n {系统名}.Data`
+3. 创建应用项目:
+   - Web 应用:`dotnet new cube -n {系统名}Web`
+   - 控制台应用:`dotnet new nconsole -n {系统名}App`
+4. 编辑 `Model.xml` 进行数据建模
+5. 执行 `xcode` 生成实体类
+
+### 2.3 核心工作流
+
+```
+理解业务需求 → 数据建模(Model.xml) → 生成实体类(xcode) → 编写业务代码
+```
+
+**关键点**:无论哪种场景,核心都是 **充分理解业务需求,在 Model.xml 中设计合理的数据表结构**。
+
+---
+
+## 3. 环境准备
+
+### 3.1 前置要求
+
+```powershell
+# 检查 .NET SDK(要求 8.0+)
+dotnet --version
+
+# 安装全局工具 xcodetool
+dotnet tool install xcodetool -g
+```
+
+### 3.2 模板版本检查
+
+NewLife.Templates 模板会持续更新,使用前需检查版本:
+
+```powershell
+# 查看模板详情
+dotnet new details NewLife.Templates
+```
+
+**判定规则**:输出包含类似 `包版本: 1.1.2025.820-beta1836`
+- 其中 `1.1.2025.820` 表示 v1.1,发布日期为 2025-08-20
+- **要求**:发布日期需 > 2025-08-01(即严格晚于 2025-08-01)
+
+```powershell
+# 若未安装或版本过旧,执行安装/更新
+dotnet new install NewLife.Templates
+```
+
+> **强约束**:仅当未安装或发布日期 ≤ 2025-08-01 时才执行安装;否则保持现状,避免无谓变更。
+
+### 3.3 模板说明
+
+| 模板 | 命令 | 用途 |
+|------|------|------|
+| `xcode` | `dotnet new xcode -n Name.Data` | 数据类库项目 |
+| `cube` | `dotnet new cube -n NameWeb` | Web 管理后台 |
+| `nconsole` | `dotnet new nconsole -n NameApp` | 控制台应用 |
+
+---
+
+## 4. Model.xml 完整参考
+
+### 4.1 文件结构
+
+```xml
+<?xml version="1.0" encoding="utf-8"?>
+<EntityModel xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+             xs:schemaLocation="https://newlifex.com https://newlifex.com/Model202509.xsd" 
+             xmlns="https://newlifex.com/Model202509.xsd">
+  <Option>
+    <!-- 全局配置 -->
+  </Option>
+  <Tables>
+    <Table>
+      <Columns>
+        <Column />
+      </Columns>
+      <Indexes>
+        <Index />
+      </Indexes>
+    </Table>
+  </Tables>
+</EntityModel>
+```
+
+### 4.2 Option 配置项
+
+| 配置项 | 说明 | 示例 |
+|--------|------|------|
+| `Namespace` | 命名空间 | `Zero.Data` |
+| `ConnName` | 数据库连接名 | `Zero` |
+| `Output` | 实体类输出目录 | `.\` |
+| `BaseClass` | 实体基类 | `Entity` |
+| `ChineseFileName` | 使用中文文件名 | `True` |
+| `Nullable` | 生成可空引用类型 | `True` |
+| `HasIModel` | 实现 IModel 接口 | `True` |
+| `ModelClass` | 模型类模板 | `{name}Model` |
+| `ModelsOutput` | 模型类输出目录 | `.\Models\` |
+| `ModelInterface` | 模型接口模板 | `I{name}` |
+| `InterfacesOutput` | 接口输出目录 | `.\Interfaces\` |
+| `NameFormat` | 命名格式 | `Default`/`Upper`/`Lower`/`Underline` |
+| `DisplayName` | 魔方区域显示名 | `订单管理` |
+| `CubeOutput` | 魔方控制器输出目录 | `../../Web/Areas/Order` |
+
+### 4.3 Table 属性
+
+| 属性 | 说明 | 示例 |
+|------|------|------|
+| `Name` | 实体类名 | `User` |
+| `TableName` | 数据库表名(可选,默认同 Name) | `sys_user` |
+| `Description` | 表说明 | `用户。用户账号信息` |
+| `ConnName` | 独立连接名(覆盖全局) | `Log` |
+| `BaseType` | 基类(支持实体继承) | `EntityBase` |
+| `InsertOnly` | 仅插入模式(日志表优化) | `True` |
+| `IsView` | 视图标识 | `True` |
+
+### 4.4 Column 属性完整参考
+
+#### 基础属性
+
+| 属性 | 说明 | 示例 |
+|------|------|------|
+| `Name` | 属性名 | `UserName` |
+| `ColumnName` | 数据库列名(可选) | `user_name` |
+| `DataType` | 数据类型 | `Int32`/`Int64`/`String`/`DateTime`/`Boolean`/`Double`/`Decimal` |
+| `Description` | 字段说明 | `用户名。登录账号` |
+| `Length` | 字符串长度 | `50`/`200`/`-1`(大文本) |
+| `Precision` | 数值精度 | `18` |
+| `Scale` | 小数位数 | `2` |
+
+#### 主键与标识
+
+| 属性 | 说明 | 示例 |
+|------|------|------|
+| `PrimaryKey` | 主键 | `True` |
+| `Identity` | 自增标识 | `True` |
+| `Master` | 主字段(业务主要字段) | `True` |
+
+#### 约束与默认值
+
+| 属性 | 说明 | 示例 |
+|------|------|------|
+| `Nullable` | 允许空 | `False` |
+| `DefaultValue` | 默认值 | `0`/`''`/`getdate()` |
+
+#### 映射关系(Map)
+
+格式:`表名@主键@显示字段@属性名`
+
+| 格式 | 说明 | 示例 |
+|------|------|------|
+| `Table@Id@Name` | 基本映射(三段) | `Role@Id@Name` |
+| `Table@Id@Name@RoleName` | 指定属性名(四段) | `Role@Id@Name@RoleName` |
+| `NS.Table@Id@Path@AreaPath` | 完整命名空间 | `XCode.Membership.Area@Id@Path@AreaPath` |
+
+#### 元素类型(ItemType)
+
+用于魔方前端渲染和数据验证:
+
+| ItemType | 说明 |
+|----------|------|
+| `image` | 图片上传 |
+| `file` | 文件上传 |
+| `mail` | 邮箱格式 |
+| `mobile` | 手机号格式 |
+| `url` | URL 链接 |
+| `TimeSpan` | 时间间隔(秒转可读格式) |
+| `GMK` | 字节数转 GB/MB/KB |
+| `html` | HTML 富文本 |
+| `code` | 代码编辑器 |
+| `json` | JSON 编辑器 |
+
+#### 显示选项(ShowIn)
+
+控制字段在魔方各区域的显示,支持三种语法:
+
+**语法一:具名列表(推荐)**
+```
+ShowIn="List,Search"          # List和Search显示
+ShowIn="-EditForm,-Detail"    # 编辑表单和详情隐藏
+ShowIn="All,-Detail"          # 全部显示,详情隐藏
+ShowIn="None,Search,Add"      # 全部隐藏,搜索和添加显示
+```
+
+区域别名:`List(L)`、`Detail(D)`、`AddForm(Add/A)`、`EditForm(Edit/E)`、`Search(S)`、`Form(F)`(同时控制 Add 和 Edit)
+
+**语法二:管道分隔**
+```
+ShowIn="Y|Y|N||A"   # List=显示|Detail=显示|Add=隐藏|Edit=自动|Search=自动
+```
+
+**语法三:5字符掩码**
+```
+ShowIn="11110"      # 1=显示, 0=隐藏, A/?/-=自动
+```
+
+#### 分表字段(DataScale)
+
+| 值 | 说明 |
+|----|------|
+| `time` | 大数据单表的时间字段(用于雪花 ID) |
+| `timeShard:yyMMdd` | 分表字段,按日期格式分表 |
+
+#### 其他属性
+
+| 属性 | 说明 | 示例 |
+|------|------|------|
+| `Type` | 枚举类型 | `XCode.Membership.SexKinds` |
+| `Category` | 表单分组 | `登录信息`/`扩展` |
+| `Attribute` | 额外特性 | `XmlIgnore, IgnoreDataMember` |
+| `Model` | 是否包含在模型类中 | `False` |
+| `RawType` | 原始数据库类型 | `varchar(50)` |
+
+### 4.5 Index 属性
+
+| 属性 | 说明 | 示例 |
+|------|------|------|
+| `Columns` | 索引列(逗号分隔) | `Name`/`Category,CreateTime` |
+| `Unique` | 唯一索引 | `True` |
+
+### 4.6 完整示例
+
+```xml
+<?xml version="1.0" encoding="utf-8"?>
+<EntityModel xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" 
+             xs:schemaLocation="https://newlifex.com https://newlifex.com/Model202509.xsd" 
+             xmlns="https://newlifex.com/Model202509.xsd">
+  <Option>
+    <Namespace>Order.Data</Namespace>
+    <ConnName>Order</ConnName>
+    <Output>.\</Output>
+    <ChineseFileName>True</ChineseFileName>
+    <Nullable>True</Nullable>
+    <HasIModel>True</HasIModel>
+    <DisplayName>订单管理</DisplayName>
+    <CubeOutput>../../OrderWeb/Areas/Order</CubeOutput>
+  </Option>
+  <Tables>
+    <Table Name="Order" Description="订单。电商订单主表">
+      <Columns>
+        <Column Name="Id" DataType="Int64" PrimaryKey="True" DataScale="time" Description="编号" />
+        <Column Name="OrderNo" DataType="String" Master="True" Length="50" Nullable="False" Description="订单号" />
+        <Column Name="UserId" DataType="Int32" Map="User@Id@Name" Description="用户" />
+        <Column Name="Status" DataType="Int32" Type="Order.Data.OrderStatus" Description="状态" />
+        <Column Name="TotalAmount" DataType="Decimal" Precision="18" Scale="2" Description="总金额" />
+        <Column Name="Remark" DataType="String" Length="500" Description="备注" Category="扩展" />
+        <Column Name="CreateUser" DataType="String" Description="创建者" Model="False" Category="扩展" />
+        <Column Name="CreateTime" DataType="DateTime" Nullable="False" Description="创建时间" Category="扩展" />
+        <Column Name="UpdateTime" DataType="DateTime" Description="更新时间" Model="False" Category="扩展" />
+      </Columns>
+      <Indexes>
+        <Index Columns="OrderNo" Unique="True" />
+        <Index Columns="UserId" />
+        <Index Columns="Status,CreateTime" />
+      </Indexes>
+    </Table>
+  </Tables>
+</EntityModel>
+```
+
+---
+
+## 5. 实体类操作指南
+
+### 5.1 基础 CRUD
+
+```csharp
+// 新增
+var entity = new User { Name = "test", Password = "123456" };
+entity.Insert();
+
+// 查询单个
+var user = User.FindByKey(1);
+var user = User.Find(User._.Name == "test");
+
+// 查询列表
+var list = User.FindAll();
+var list = User.FindAll(User._.Status == 1, User._.Id.Desc(), null, 0, 10);
+
+// 更新
+user.Name = "newName";
+user.Update();
+
+// 删除
+user.Delete();
+
+// 保存(自动判断 Insert/Update)
+entity.Save();
+```
+
+### 5.2 高级查询
+
+```csharp
+// 分页查询
+var page = new PageParameter { PageIndex = 1, PageSize = 20 };
+var list = User.FindAll(User._.Status == 1, page);
+
+// 条件组合
+var where = new WhereExpression();
+where &= User._.Status == 1;
+where &= User._.CreateTime >= DateTime.Today;
+if (!key.IsNullOrEmpty()) where &= User._.Name.Contains(key);
+var list = User.FindAll(where, page);
+
+// 统计
+var count = User.FindCount(User._.Status == 1);
+
+// 查询最大/最小值
+var maxId = User.FindMax(User._.Id, null);
+```
+
+### 5.3 批量操作
+
+```csharp
+// 批量插入
+var list = new List<User>();
+list.Insert();
+
+// 批量更新
+User.Update(User._.Status == 2, User._.Status == 1);
+
+// 批量删除
+User.Delete(User._.Status == 0);
+```
+
+### 5.4 异步操作
+
+```csharp
+var user = await User.FindAsync(User._.Id == 1);
+var list = await User.FindAllAsync(User._.Status == 1, page);
+await entity.InsertAsync();
+await entity.SaveAsync();  // 异步保存,用于日志等高频写入
+```
+
+### 5.5 缓存查询
+
+```csharp
+// 实体缓存(适用于小表)
+var list = User.FindAllWithCache();
+
+// 单对象缓存(按主键)
+var user = User.FindByKeyWithCache(1);
+```
+
+---
+
+## 6. 多模块项目结构
+
+对于复杂业务系统,建议按模块组织:
+
+```
+Zero.Data/
+├── Order/           # 订单模块
+│   ├── Order.xml    # 订单模型
+│   ├── 订单.cs
+│   └── 订单明细.cs
+├── Product/         # 商品模块
+│   ├── Product.xml  # 商品模型
+│   ├── 商品.cs
+│   └── 分类.cs
+└── Member/          # 会员模块
+    ├── Member.xml   # 会员模型
+    └── 会员.cs
+```
+
+每个模块目录内有独立的 `*.xml` 模型文件,在各自目录执行 `xcode` 命令生成实体类。
+
+---
+
+## 7. xcode 命令参考
+
+```powershell
+# 在模型文件所在目录执行(自动查找所有 *.xml)
+xcode
+
+# 指定模型文件
+xcode Model.xml
+xcode Order.xml
+```
+
+**执行效果**:
+1. 读取 XML 模型文件
+2. 生成实体类(`*.cs`)
+3. 生成模型类(如配置了 `ModelClass`)
+4. 生成接口(如配置了 `ModelInterface`)
+5. 生成数据字典(`*.htm`)
+6. 生成魔方控制器(如配置了 `CubeOutput`)
+
+---
+
+## 8. 常见问题
+
+### 8.1 模型文件命名
+
+- 默认:`Model.xml`
+- 推荐:`{系统英文名}.xml` 或 `{模块名}.xml`
+- 复杂项目:每个模块目录一个模型文件
+
+### 8.2 实体类生成位置
+
+- 实体类生成在 `xcode` 命令执行目录
+- 可通过 `Output` 配置项指定输出目录
+- 魔方控制器通过 `CubeOutput` 指定
+
+### 8.3 数据库连接
+
+在应用配置文件中配置连接字符串:
+
+```json
+{
+  "ConnectionStrings": {
+    "Order": "Server=.;Database=Order;Uid=sa;Pwd=xxx"
+  }
+}
+```
+
+连接名对应 Model.xml 中的 `ConnName`。
+
+---
+
+## 9. 与 Cube 的协作
+
+当需要生成 Web 管理界面时:
+
+1. 在 Model.xml 中配置 `CubeOutput` 指向 Web 项目的 Areas 目录
+2. 配置 `DisplayName` 作为魔方区域名称
+3. 执行 `xcode` 自动生成控制器
+4. 深度定制请参考 `cube.instructions.md`
+
+---
+
+## 10. Copilot 行为指引
+
+### 10.1 数据建模时
+
+1. **充分理解业务**:在设计表结构前,确保理解业务场景和数据关系
+2. **合理设计主键**:
+   - 普通表:`Int32` 自增主键
+   - 大数据表:`Int64` + `DataScale="time"`(雪花 ID)
+3. **必要的索引**:为查询条件字段添加索引
+4. **字段长度**:String 类型必须指定合理的 `Length`
+
+### 10.2 生成代码时
+
+1. 确保在正确目录执行 `xcode`
+2. 生成后检查编译是否通过
+3. 如需修改生成的代码,应修改 Model.xml 后重新生成
+
+### 10.3 边界意识
+
+- 数据模型和实体操作 → 本指令
+- Web 控制器和界面 → `cube.instructions.md`
+- 基础编码规范 → `copilot-instructions.md`
Added +76 -0
diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
index 0000000..2b76c42
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,76 @@
+# 新生命远程通信库(NewLife.Remoting)变更日志
+
+## v3.7.2026.0201 (2026-02-01)
+
+### 新功能
+- ApiServer 支持动态端口分配
+- 新增 ApiServer/Client 全量单元测试
+
+### Bug修复
+- 修正动态注册下发证书时,错误把密钥赋值给 Code 的问题
+- 修正通过 Http 请求 ApiServer 时,服务端按 json 返回,不要走 IAccessor 的问题
+
+### 优化改进
+- 优化 OAuth 异常处理,细化 HTTP 状态码返回
+- 优化 HttpMessage 请求行与头部解析,增强兼容性
+- 单元测试端口改为动态分配,提升 CI 稳定性
+- 优化 test.yml 构建与测试流程
+
+### 文档改进
+- 增强接口文档与注释
+- 完善设备服务注释文档
+- 补充命令客户端单元测试
+
+### 依赖更新
+- 升级 NewLife.* 相关组件到最新版本
+
+---
+
+## v3.7.2026.0102 (2026-01-02)
+
+### 新功能
+- ApiServer 支持异步方法
+- ClientBase 客户端支持事件总线
+- 支持 EventHub 分发 WebSocket 事件
+- 增加阿里云 OpenAPI 客户端
+- ICacheProvider 支持创建默认事件总线
+
+### 优化改进
+- 优化 SessionManager/WsCommandSession,完善代码注释
+- WsCommandSession 支持事件广播与 IEventDispatcher
+- 重构 WebSocket 通信,统一消息处理与收发
+- 引入 IEventDispatcher 架构来分发消息
+- 引入 ITraceMessage,从接收消息中解码 TraceId
+- 优先使用 IJsonHost 序列化
+- 支持配置 SaltPasswordProvider 的算法和盐值时间
+- 加大接收缓冲区
+- 等待大循环等长耗时(>500ms)任务,采用 LongRunning 创建,避免占用线程池
+
+### Bug修复
+- 禁止异常 CommandModel 进入命令处理流程
+- 释放 WebSocket,使用安全销毁,因为 WebSocket 关闭时经常会抛出异常
+- 修正对管道处理器的使用
+- 修正在线记录更新返回 0 时的处理逻辑
+
+---
+
+## v3.6.2025.1112 (2025-11-12)
+
+### 新功能
+- 支持 .NET 10
+
+### Bug修复
+- 修正使用缓存时,必须增加 Name 前缀,解决了星尘平台中 Node 和 App 相互冲突的问题
+
+---
+
+## v3.2.2024.1202 (2024-12-02)
+
+### Bug修复
+- 修正 RPC 传输超大报文(>64k)时解码失败的问题
+- 修正 IPacket.ReadBytes 导致链表式数据读取错误
+- 修正单元测试 BigMessage 大报文响应时出现混乱的问题
+
+### 优化改进
+- 响应结果可能是 IOwnerPacket,需要释放资源,把缓冲区还给池
+- 优化登录状态,注销后进入 Ready,允许重新登录,修正 StarAgent 切换服务器时无法自动重新登录的问题
Modified +3 -3
diff --git a/NewLife.Remoting.Extensions/NewLife.Remoting.Extensions.csproj b/NewLife.Remoting.Extensions/NewLife.Remoting.Extensions.csproj
index beb1623..cf2ad84 100644
--- a/NewLife.Remoting.Extensions/NewLife.Remoting.Extensions.csproj
+++ b/NewLife.Remoting.Extensions/NewLife.Remoting.Extensions.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <OutputType>Library</OutputType>
@@ -33,7 +33,7 @@
     <RepositoryUrl>https://github.com/NewLifeX/NewLife.Remoting</RepositoryUrl>
     <RepositoryType>git</RepositoryType>
     <PackageTags>新生命团队;X组件;NewLife;$(AssemblyName)</PackageTags>
-    <PackageReleaseNotes>ApiServer支持异步方法;ClientBase客户端支持事件总线;支持EventHub分发WebSocket事件;增加阿里云OpenAPI客户端</PackageReleaseNotes>
+    <PackageReleaseNotes>ApiServer支持动态端口分配;修正证书密钥赋值错误;优化OAuth异常处理;增强HttpMessage解析兼容性;提升单元测试稳定性</PackageReleaseNotes>
     <PackageLicenseExpression>MIT</PackageLicenseExpression>
     <PublishRepositoryUrl>true</PublishRepositoryUrl>
     <EmbedUntrackedSources>true</EmbedUntrackedSources>
@@ -64,7 +64,7 @@
     </None>
   </ItemGroup>
   <ItemGroup>
-    <PackageReference Include="NewLife.XCode" Version="11.23.2026.119-beta1332" />
+    <PackageReference Include="NewLife.XCode" Version="11.23.2026.131-beta0946" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\NewLife.Remoting\NewLife.Remoting.csproj" />
Modified +3 -3
diff --git a/NewLife.Remoting/NewLife.Remoting.csproj b/NewLife.Remoting/NewLife.Remoting.csproj
index efb572a..193c910 100644
--- a/NewLife.Remoting/NewLife.Remoting.csproj
+++ b/NewLife.Remoting/NewLife.Remoting.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <TargetFrameworks>net45;net461;netstandard2.0;netstandard2.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0</TargetFrameworks>
     <AssemblyTitle>协议通信库</AssemblyTitle>
@@ -30,7 +30,7 @@
     <RepositoryUrl>https://github.com/NewLifeX/NewLife.Remoting</RepositoryUrl>
     <RepositoryType>git</RepositoryType>
     <PackageTags>新生命团队;X组件;NewLife;$(AssemblyName)</PackageTags>
-    <PackageReleaseNotes>ApiServer支持异步方法;ClientBase客户端支持事件总线;支持EventHub分发WebSocket事件;增加阿里云OpenAPI客户端</PackageReleaseNotes>
+    <PackageReleaseNotes>ApiServer支持动态端口分配;修正证书密钥赋值错误;优化OAuth异常处理;增强HttpMessage解析兼容性;提升单元测试稳定性</PackageReleaseNotes>
     <PackageLicenseExpression>MIT</PackageLicenseExpression>
     <PublishRepositoryUrl>true</PublishRepositoryUrl>
     <EmbedUntrackedSources>true</EmbedUntrackedSources>
@@ -54,7 +54,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="NewLife.Core" Version="11.10.2026.124-beta1535" />
+    <PackageReference Include="NewLife.Core" Version="11.11.2026.201" />
   </ItemGroup>
 
   <ItemGroup>
Modified +4 -4
diff --git a/Samples/IoTZero/IoTZero.csproj b/Samples/IoTZero/IoTZero.csproj
index bc17262..9f1ef7a 100644
--- a/Samples/IoTZero/IoTZero.csproj
+++ b/Samples/IoTZero/IoTZero.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework>net10.0</TargetFramework>
@@ -23,12 +23,12 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="NewLife.Cube.Core" Version="6.8.2026.125-beta1429" />
+    <PackageReference Include="NewLife.Cube.Core" Version="6.8.2026.128-beta0607" />
     <PackageReference Include="NewLife.IoT" Version="2.7.2026.124-beta0342" />
     <PackageReference Include="NewLife.MQTT" Version="2.3.2026.114-beta0604" />
     <PackageReference Include="NewLife.Redis" Version="6.4.2026.111-beta1644" />
-    <PackageReference Include="NewLife.Stardust.Extensions" Version="3.6.2026.125-beta0604" />
-    <PackageReference Include="NewLife.XCode" Version="11.23.2026.119-beta1332" />
+    <PackageReference Include="NewLife.Stardust.Extensions" Version="3.6.2026.131-beta0627" />
+    <PackageReference Include="NewLife.XCode" Version="11.23.2026.131-beta0946" />
   </ItemGroup>
 
   <ItemGroup>
Modified +3 -3
diff --git a/Samples/Zero.RpcServer/Zero.RpcServer.csproj b/Samples/Zero.RpcServer/Zero.RpcServer.csproj
index c20f7a8..6c38de0 100644
--- a/Samples/Zero.RpcServer/Zero.RpcServer.csproj
+++ b/Samples/Zero.RpcServer/Zero.RpcServer.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
@@ -21,8 +21,8 @@
 
   <ItemGroup>
     <PackageReference Include="NewLife.Redis" Version="6.4.2026.111-beta1644" />
-    <PackageReference Include="NewLife.Stardust" Version="3.6.2026.125-beta0604" />
-    <PackageReference Include="NewLife.XCode" Version="11.23.2026.119-beta1332" />
+    <PackageReference Include="NewLife.Stardust" Version="3.6.2026.131-beta0627" />
+    <PackageReference Include="NewLife.XCode" Version="11.23.2026.131-beta0946" />
   </ItemGroup>
 
   <ItemGroup>
Modified +4 -4
diff --git a/Samples/ZeroServer/ZeroServer.csproj b/Samples/ZeroServer/ZeroServer.csproj
index 904e304..31795ab 100644
--- a/Samples/ZeroServer/ZeroServer.csproj
+++ b/Samples/ZeroServer/ZeroServer.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
 
   <PropertyGroup>
     <TargetFramework>net10.0</TargetFramework>
@@ -19,10 +19,10 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="NewLife.Cube.Core" Version="6.8.2026.125-beta1429" />
+    <PackageReference Include="NewLife.Cube.Core" Version="6.8.2026.128-beta0607" />
     <PackageReference Include="NewLife.Redis" Version="6.4.2026.111-beta1644" />
-    <PackageReference Include="NewLife.Stardust.Extensions" Version="3.6.2026.125-beta0604" />
-    <PackageReference Include="NewLife.XCode" Version="11.23.2026.119-beta1332" />
+    <PackageReference Include="NewLife.Stardust.Extensions" Version="3.6.2026.131-beta0627" />
+    <PackageReference Include="NewLife.XCode" Version="11.23.2026.131-beta0946" />
   </ItemGroup>
 
   <ItemGroup>
Modified +1 -1
diff --git a/Test/Test.csproj b/Test/Test.csproj
index 2eb8949..10d7536 100644
--- a/Test/Test.csproj
+++ b/Test/Test.csproj
@@ -10,7 +10,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="NewLife.Core" Version="11.10.2026.124-beta1535" />
+    <PackageReference Include="NewLife.Core" Version="11.11.2026.201" />
   </ItemGroup>
 
   <ItemGroup>
Modified +1 -1
diff --git a/XUnitTest/XUnitTest.csproj b/XUnitTest/XUnitTest.csproj
index c50f572..c16ee71 100644
--- a/XUnitTest/XUnitTest.csproj
+++ b/XUnitTest/XUnitTest.csproj
@@ -12,7 +12,7 @@
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.2" />
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
     <PackageReference Include="Moq" Version="4.20.72" />
-    <PackageReference Include="NewLife.Core" Version="11.10.2026.124-beta1535" />
+    <PackageReference Include="NewLife.Core" Version="11.11.2026.201" />
     <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">