2.5 KiB
2.5 KiB
服务端4xx写入可能性核查(阶段3B审查证据)
日期:2026-09-22。核查人:主会话(ZCode),应用户2026-09-22裁决第4项执行。方式:只读源码核查,无服务端修改、无请求发送、无正式服操作。
核查对象
- 服务端仓库
C:/projects/N3-Server-CN,HEAD858fe7c(KV 功能提交a3d3faa)。 - 入口:
LeaderboardAPI/Controllers/PlayerDataApi.cs([Authorize],路由playerdata/Get|Set|Delete)。 - 服务层:
LeaderboardBLL/Services/PlayerKV/PlayerKVService.cs(EF Core → MySQLPlayerKV表,SaveChangesAsync单点提交)。 - DTO:
LeaderboardBLL/Models/PlayerKVModel.cs(Set.data/Delete.keys带[Required])。 - 管道:
LeaderboardAPI/Program.cs(Cookie 认证;OnRedirectToLogin/OnRedirectToAccessDenied改写为 403;未发现把异常转成 4xx 的中间件)。
变更请求(Set/Delete)的 4xx 路径清单
| 状态码 | 产生点 | 相对写入时机 |
|---|---|---|
| 401/403 | Cookie 认证/授权(未认证、会话过期、拒绝) | 动作执行前,未写 |
| 400 | [ApiController] 模型绑定/校验(JSON 不可解析、data/keys 缺失) |
动作执行前,未写 |
| 400 | ResolvePlayerId 失败(NameIdentifier 缺失/非十进制) |
SetAsync/DeleteAsync 调用前,未写 |
控制器在 SetAsync/DeleteAsync 返回后仅回 200;服务层自身不产生 4xx;数据库/EF 异常未被任何中间件改写状态码,按 ASP.NET Core 默认成为 500。
结论
当前服务端版本(858fe7c)下,playerdata 变更请求的 4xx(400/401/403)全部产生于服务端写入之前,不存在"已写入后返回 4xx"的代码路径;写入之后的失败表现为 5xx。
边界与不改变项
- 本结论为源码级、版本
858fe7c时点结论;服务端后续更新需重新复核。 - 客户端本批不改动:非 200 仍一律保守按 MayHaveCommitted 处理(含 4xx)。若后续要以本证据将 4xx 降级为"确定未提交",须按差异裁决单独评审修改
PlayerKVClient及相关测试,不并入 3B 实施范围。 - 500/超时/网络中断的 MayHaveCommitted 语义不受本核查影响(提交确认丢失等场景仍然可能)。
Set空字典 /Delete空列表为 200 no-op;Set批内多键经单次SaveChangesAsync(EF 默认隐式事务)提交,不构成跨请求原子性。- 若部署拓扑插入会改写状态码的反向代理,需在最终包环境复核;当前客户端直连
http://s101.local:18080/。