Skip to content

Commit e58d243

Browse files
authored
Merge pull request #5 from GeneralLibrary/fix/copilot-review
fix: address Copilot review comments on PR #3
2 parents 231c1c2 + a47b579 commit e58d243

5 files changed

Lines changed: 14 additions & 14 deletions

File tree

.clinerules/01-generalupdate-init.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ SetSource(url, key) -> SetOption(AppType.Client) -> LaunchAsync()
1313

1414
## 4 大场景: None/UpgradeOnly/MainOnly/Both
1515

16-
## manifest.json 字段
16+
## generalupdate.manifest.json 字段
1717
MainAppName, UpdateAppName, ProductId, InstallPath, UpdatePath, ClientVersion, UpgradeClientVersion
1818

1919
## 关键: UpgradeApp须随首个版本发布, 双进程AppSecretKey一致, 版本4段式

.clinerules/05-generalupdate-troubleshoot.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ tags: ["dotnet", "generalupdate"]
1717

1818
## 诊断流程 (5步)
1919

20-
1. **版本号**`manifest.json``ClientVersion` / `UpgradeClientVersion` 是否与服务端返回的版本一致? 4段式版本(string)严格匹配。
20+
1. **版本号**`generalupdate.manifest.json``ClientVersion` / `UpgradeClientVersion` 是否与服务端返回的版本一致? 4段式版本(string)严格匹配。
2121
2. **manifest 字段**`MainAppName``UpdateAppName``ProductId``InstallPath``UpdatePath` 是否填写正确且与服务端一致?
2222
3. **UpgradeApp 存在** — 主应用目录下是否存在 `Upgrade` 子目录及 `Upgrade.exe` (或对应平台可执行文件)? 随首个版本一同发布的。
2323
4. **策略可访问**`SetSource(url, key)` 配置的 API/OSS 端点能否正常响应? OSS 策略需要 `SetOSSInfo` 配置正确。
@@ -29,7 +29,7 @@ tags: ["dotnet", "generalupdate"]
2929
|------|------|-----------|
3030
| **升级没启动** | `LaunchAsync()` 未调用 / 调用顺序错误 / 主进程未检测到新版本 | 确认 `Bootstrap.LaunchAsync()``Main()` 中调用, 且 `SetOption(AppType.Client)` 正确 |
3131
| **Method not found** | 引用的 GeneralUpdate 版本与服务端不匹配 / 混用不同大版本 | 统一 NuGet 版本, 清理 bin/obj 后重新生成 |
32-
| **路径超长 (>260)** | Windows 路径限制, `InstallPath` / `UpdatePath` 过深 | 缩短安装路径; 或启用 `SetOption` 中的长路径支持 (`LongPathSupport = true`) |
32+
| **路径超长 (>260)** | Windows 路径限制, `InstallPath` / `UpdatePath` 过深 | 缩短安装路径; 或在项目配置中启用长路径支持 (`app.manifest` / `runtimeconfig`) |
3333
| **IPC 暴露** | EncryptedFile IPC 写入明文 / NamedPipe 未鉴权 | 启用加密传输; NamedPipe 设置 `AccessControl` 限制连接用户; 不使用 `AutoFallback` 回退到明文 |
3434
| **跨租户泄露** | 多租户部署共用 `ProductId` / `AppSecretKey` | 每个租户分配独立 `ProductId``AppSecretKey`; 服务端鉴权时校验租户标识 |
3535

@@ -38,7 +38,7 @@ tags: ["dotnet", "generalupdate"]
3838
| 问题 | 原因 | 排查/解决 |
3939
|------|------|-----------|
4040
| **静默更新不生效** | `UpdateMode.Silent` 配置缺失 / 权限不足无法后台启动 | 确认 `SetOption(UpdateMode.Silent)` 且应用有后台运行权限; 检查 `LaunchCommand` 参数是否正确传递 |
41-
| **无限循环更新** | `ClientVersion` 与服务端最新版本不一致导致不断检测到"新版本" | 验证更新后是否更新了本地 `manifest.json` 的版本号; 确认服务端已标记该版本为"已发布"状态 |
41+
| **无限循环更新** | `ClientVersion` 与服务端最新版本不一致导致不断检测到"新版本" | 验证更新后是否更新了本地 `generalupdate.manifest.json` 的版本号; 确认服务端已标记该版本为"已发布"状态 |
4242
| **OSS 无更新** | Bucket 配置错误 / 文件命名不匹配 / 签名过期 | `curl` 测试 OSS URL 是否直接可下载; 确认 `SetOSSInfo` 的 endpoint/bucket/region 正确 |
4343
| **文件占用** | 更新时目标文件正在被使用 (主进程/杀软/搜索索引) | 关闭主进程后更新; 使用 `Bowl` 守护进程管理进程生命周期; 排除杀软扫描目录 |
4444

@@ -50,9 +50,9 @@ tags: ["dotnet", "generalupdate"]
5050
| **差分更新失败** | BSDIFF 补丁应用时数据不完整 / 旧版本基准文件不匹配 | 校验原始文件哈希; 确认差分策略仅在同源版本间使用 |
5151
| **升级后配置丢失** | `UpdatePath` 未包含配置文件 / 更新后未合并 `appsettings.json` | 在更新流程中添加配置文件合并步骤; 或使用外部配置中心 |
5252
| **信号量泄露** | IPC 信号量未正确释放, 重启后端口/资源被占用 | 重启系统; 检查 `Bowl` 是否正确清理资源; 监控信号量计数 |
53-
| **ZIP 遍历写入** | 恶意更新的 ZIP 包包含 `../` 路径覆盖系统文件 | 使用 `ZipSecurity` 校验项, 拒绝包含 `../` 或绝对路径的条目 |
53+
| **ZIP 遍历写入** | 恶意更新的 ZIP 包包含 `../` 路径覆盖系统文件 | 解压时校验 ZIP 条目路径, 拒绝包含 `../` 或绝对路径的条目 |
5454
| **AOT 编译失败** | 动态加载 / 反射代码未适配 NativeAOT | 添加 `[DynamicDependency]` 特性; 避免 `Assembly.Load` 等动态加载 |
55-
| **SignalR 重连慢** | WebSocket 长连接断开后 `RetryDelay` 配置过长 | 调整 `SignalRRetryPolicy``RetryDelay``MaxRetryCount` |
55+
| **SignalR 重连慢** | WebSocket 长连接断开后 `RetryDelay` 配置过长 | 降低重试延迟并限制最大重试次数, 或自定义重连策略 |
5656
| **SSL 证书错误** | 自签名证书未受信 / 服务器 SNI 不匹配 | 配置 `SslValidationPolicy`; 或添加自定义证书验证委托 |
5757

5858
## L级 (Low) — 非关键
@@ -69,7 +69,7 @@ tags: ["dotnet", "generalupdate"]
6969

7070
```bash
7171
# 测试 API 是否可访问
72-
curl -v "http://your-server/api/update/check?appName=MyApp&clientVersion=1.0.0.1"
72+
curl -v -X POST "http://your-server/Upgrade/Verification" -H "Content-Type: application/json" -d '{"appKey":"xxx","appType":1,"clientVersion":"1.0.0.1","productId":"xxx","platform":"windows","tenantId":"default"}'
7373

7474
# 验证 manifest.json 内容
7575
cat /path/to/app/manifest.json | jq .
@@ -98,6 +98,6 @@ powershell "Get-CimInstance Win32_Semaphore | Select-Object Name, Count"
9898
## 安全注意事项
9999

100100
- IPC 传输 — 不使用明文 `AutoFallback`, 始终启用加密
101-
- ZIP 包校验 — 启用 `ZipSecurity` 拒绝路径穿越条目
101+
- ZIP 包校验 — 解压时校验 ZIP 条目路径, 拒绝 `../` 和绝对路径条目
102102
- 签名验证 — 程序集签名: 在 `SetSource` 中提供公钥, 拒绝未签名更新
103103
- AppSecretKey 管理 — 硬编码在客户端是最后手段; 优先从启动参数或环境变量注入

.cursor/rules/generalupdate-init.mdc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@ SetSource(url, key) -> SetOption(AppType.Client) -> LaunchAsync()
1717
## 4 大更新场景
1818
- None, UpgradeOnly, MainOnly, Both
1919

20-
## manifest.json
20+
## generalupdate.manifest.json
2121
MainAppName, UpdateAppName, ProductId, InstallPath, UpdatePath, ClientVersion, UpgradeClientVersion
2222

2323
## 关键警告
2424
- UpgradeApp.exe 必须随首个版本发布(不能自己下载自己)
2525
- Client 和 Upgrade 必须相同 AppSecretKey
2626
- 版本号必须是 4 段式
27-
- manifest ClientVersion 不能为空
27+
- generalupdate.manifest.json ClientVersion 不能为空
2828

2929
## 3 种配置方式
30-
- Minimal: SetSource + manifest.json
30+
- Minimal: SetSource + generalupdate.manifest.json
3131
- Standard: SetConfig(UpdateRequest) + Option + events
3232
- appsettings: LoadFromConfiguration(config)
3333

.github/instructions/backend-api.instructions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ applyTo: "**/*.cs"
99
## Verification Endpoint
1010
POST /Upgrade/Verification
1111
Request: appKey, appType, clientVersion, productId, platform, tenantId
12-
Response: body[{ id, version, url, hash, size, name, appType, isCrossVersion }]
12+
Response: { code, message, body: [{ id, version, url, hash, size, name, appType, isCrossVersion }] }
1313

1414
## Report Endpoint
1515
POST /Upgrade/Report

RULES.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
- IPC: Encrypted file(AES, default), NamedPipe, SharedMemory, AutoFallback
77

88
## Bootstrap
9-
- Minimal: SetSource(url, key) -> SetOption(Client) -> LaunchAsync()
9+
- Minimal: SetSource(url, key) -> SetOption(AppType.Client) -> LaunchAsync()
1010
- Standard: SetConfig(UpdateRequest) -> SetOption() -> AddListener*() -> LaunchAsync()
1111
- From config: LoadFromConfiguration(config.GetSection("GeneralUpdate"))
1212

@@ -46,7 +46,7 @@ Hooks, Strategy, UpdateReporter, DownloadSource, DownloadOrchestrator, DownloadP
4646

4747
## Diagnostics
4848
1. NuGet versions match
49-
2. manifest.json valid
49+
2. generalupdate.manifest.json valid
5050
3. UpgradeApp.exe exists
5151
4. Server API reachable
5252
5. Logs in Logs/generalupdate-trace *.log

0 commit comments

Comments
 (0)