Files
ft/CodexOutput/upserver/方案与评审.md

72 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# s101 客户端迁移方案与评审
当前入口已更新为《客户端迁移详细修改方案.md》:KV接口缺失已由a3d3faa解决,开发批次、技术裁决和剩余行为确认以详细方案为准。下文保留早期调研记录。
日期:2026-09-15。状态:调研完成,契约待补齐;当前为评审草案,不是开发放行记录。
用户已确认:正式 API 基址为 http://s101.local:18080/。此前将 s101 当成 192.168.9.101 是错误推断;对旧 IP 的超时不能说明正式服务不可达。Hub 路由及认证字段仍需服务端契约确认。
正确地址实测:GET / 返回 HTTP 200、n3ftapi 0.0.1-nogit;GET /account/svrtime 返回 HTTP 200。GET /swagger/v1/swagger.json、/swagger/index.html、/openapi/v1.json、/api-docs 返回 HTTP 404。连通性已确认,完整接口契约仍未获取。
## 首批可独立实施范围(已请求确认)
- 修改 DebugConfig 的 s101EventAPIUrl 与 CustomServerMgr 的旧默认 API 地址为 http://s101.local:18080/。
- RTService.WithUrl 内明确指定 WebSockets-only 和 SkipNegotiation=true,保留 Cookie、gamehub 和已有事件/重连行为。
- 不推断静态资源、Func 服务、RTM 服务的新地址;这些地址不与 API 端口混用。
- 本批验证配置与 Unity 编译;认证后成功连接仍须登录链路可用才能验收。
- 首批技术自审:范围清晰,无存档格式变更,现有 .NET SignalR 客户端支持所需选项。裁决:技术方案可执行,等待用户确认;未以此宣称整个迁移方案评审通过。
## 目标
客户端适配服务器新接口,登录 s101 正式服务;移除 PlayFab SDK,保证游戏 KV 持久化;跳过 SignalR negotiate,连接自建服务并恢复业务消息。
## 已核实事实
- UserService.Login 先登录 PlayFab,调用 async void LoginApiServer 后直接返回 Done;业务登录失败不会阻止这个成功返回。
- account/Login 当前发送 playerId/playerProfile,期望 state/internalId;尚未取得服务器新契约,不推断这些字段仍然有效。
- PlayFabMgr 使用 PlayFab UserDataRecord 和 UpdateUserData;同步失败只记日志,未确认成功就已轮换队列。
- SignalRService 使用 API 基址拼 gamehub,携带 Cookie,自动重连,没有 SkipNegotiation/WebSockets-only 配置。
- SDK 直接依赖还包含好友、排行榜、公告、玩家资料;IUserService 暴露 EntityKey。仅删除 package 会破坏编译及相关功能。
- 当前日志中 5292 与 18080 均有登录请求取消记录;本次对两端口的 Swagger 地址做只读连接探测,均超时,未收到 HTTP 响应。
- 当前工作区及抽查的相邻项目未找到本任务服务端契约。不能把端口超时直接归因于请求字段错误。
## 路线比较
| 路线 | 优点 | 问题 | 建议 |
| --- | --- | --- | --- |
| 按契约建立业务模型及服务适配,逐步替换,最后删除 SDK | 可保留存档和游戏能力,测试边界清晰 | 要覆盖 SDK 的外围功能 | 推荐 |
| 先删 SDK,再逐个修复编译错误 | 依赖暴露直接 | 无法保证行为和存档语义,缺少替代接口时无法交付 | 不采用 |
| 保留 SDK,仅改变 URL 或增加同名兼容 API | 初期修改较少 | 不能证明移除了 SDK,容易继续依赖旧协议 | 不作为最终方案 |
## 设计
### 登录与会话
以服务端明确的账号凭据、稳定玩家 ID、会话及资料响应为唯一契约。保留渠道 SDK 入口,移除 PlayFab 登录步骤。登录协调过程必须等待身份认证、业务授权和必要 KV 初始化完成才返回 Done。拒绝、超时、无效数据分别返回可重试或明确失败。登出/换号清理会话、实时连接及用户缓存;重登应合并并发请求,避免 401 触发循环。
### KV
将存档记录改为游戏自有模型,远端读写集中在适配层。优先保留现有业务调用入口、Unity 序列化引用和 key,避免迁移时无关的大规模重命名。现有账号与新身份的映射必须由服务端确认,防止旧存档读成新账号空存档。
队列写入使用稳定快照,成功后仅确认对应批次;失败保留待写项,新修改不能被旧批次重试覆盖。时间戳单位、版本控制、批次大小、可见性与跨玩家读取根据服务器契约实现。空远端数据和请求失败必须区分,禁止用默认空数据覆盖已有存档。
### SignalR
使用正式 Hub 地址、SkipNegotiation=true 和 WebSockets-only;凭据跟随服务端 Cookie 或 Token 机制,不猜测认证方式。保留既有事件名和调用语义。建立连接、断线恢复和会话更新分别验收。跳过的是 HTTP 协商,不删除 SignalR 协议握手。
依据:https://learn.microsoft.com/en-us/aspnet/core/signalr/configuration?view=aspnetcore-10.0
### SDK 清理
梳理并替换好友、排行榜、公告、玩家资料和对战匹配的 SDK 调用/类型。EventFishingDuelPanel 还调用 PlayFabMultiplayerAPI 创建/查询/取消匹配票据、查询匹配结果;这部分不能漏删或静默禁用。若服务器尚无替代能力,将其列为契约缺口,不用空结果或静默禁用掩盖。最后移除两个包及本地 SDK,清理 asmdef GUID、裁剪引用和热更新构建输入;生成项目文件及构建产物由 Unity 生成,不手工改旧 DLL。
## 开发边界
允许范围:登录、会话、KV 及其直接业务适配、SignalR、必要配置与 SDK/构建依赖、相应测试。
不包含:服务器部署或修改、生产存档迁移、付费行为、无关玩法重构、修改真实玩家数据。联调使用专用账号,日志不记录密码、Token、Cookie 或完整存档。
## 验证
测试清单见 TODO.md。通过标准必须同时覆盖编译、契约测试和 s101 真实联调;静态配置正确不能替代登录/持久化/实时消息成功。KV 重登读取需排除本地缓存影响。运行证据必须记录目标地址、部署版本、客户端提交及结果,并脱敏。
## 评审裁决
| 项目 | 裁决 | 理由/开发边界 |
| --- | --- | --- |
| 总体迁移路线 | 建议采用,待书面确认 | 按契约逐步替换,最后清 SDK |
| 登录方案 | 暂不放行 | 缺新认证请求、响应、身份映射及会话定义 |
| KV 方案 | 暂不放行 | 缺读写路由、版本/时间戳规则和旧存档兼容定义 |
| SignalR 配置方向 | 技术依据充分;实施待方案确认 | WebSockets-only + SkipNegotiation;真实认证和地址仍需核实 |
| SDK 删除 | 暂不放行 | 需明确外围能力替代方式并先完成调用迁移 |
| 当前允许工作 | 调研、契约盘点、TODO 与文档 | 不依据未知契约编写生产代码 |
自审:已明确事实与未知项、失败语义、数据保护、实施顺序和验收边界。此草案不冒充完整评审;获取契约后补全具体接口映射并更新裁决。