Files
EIS-dotnet/MIGRATION.md
T
biss fea91a19af 本阶段迁移已完成。
Excel:班级、账号、考生、缴费、考场、成绩、志愿、录取、报到及正式录取名册均改为 ClosedXML 原生处理,支持模板、校验、筛选和导入预检。[SystemWorkbook.cs](C:\\Users\\BI\\Documents\\EIS-dotnet\\src\\Eis.Infrastructure\\Spreadsheets\\SystemWorkbook.cs)
文书:录取通知书模板、成绩单/准考证/通知书业务数据与防伪验真已脱离 Node;保留现有前端排版导出效果。[AdminAdmissionService.Documents.cs](C:\\Users\\BI\\Documents\\EIS-dotnet\\src\\Eis.Infrastructure\\Administration\\AdminAdmissionService.Documents.cs)
缓存:完成 Redis 命名空间版本缓存、有界本地回退、请求合并和并发失效保护;公开数据及成绩写入后立即失效。[ApplicationCache.cs](C:\\Users\\BI\\Documents\\EIS-dotnet\\src\\Eis.Infrastructure\\Caching\\ApplicationCache.cs)
迁移清单已更新为完成。[MIGRATION.md](C:\\Users\\BI\\Documents\\EIS-dotnet\\MIGRATION.md)
2026-07-23 14:14:51 +08:00

5.3 KiB
Raw Blame History

ASP.NET Core 10 迁移

迁移采用兼容优先的渐进式方案:ASP.NET Core 作为统一入口,尚未迁移的 /api/* 请求暂时转发给运行在 4174 端口的 Node.js 服务。每完成一个功能域,就在 ASP.NET Core 中注册对应原生端点并停止转发该路径。

当前阶段

  • ASP.NET Core 10 解决方案与分层项目
  • 原前端静态资源无修改托管
  • 旧 API 兼容转发,包含 Cookie、请求体、文件下载和状态码
  • 存活与迁移就绪检查
  • 公开首页与已发布通知(原生 SQLite / MySQL 读取)
  • 招生公示与 HMAC 文书验真公开接口
  • 登录、自主注册、Session 与 TOTP(兼容开关默认关闭)
  • 考生业务
  • 管理后台、审批流和考务编排
  • 考生志愿填报与招生录取查询
  • Excel、文书和缓存
  • 容器入口切换及 Node.js 后端移除

本地运行

先在一个终端运行旧 API

$env:PORT = '4174'
npm start

再在另一个终端运行 ASP.NET Core 入口:

dotnet run --project .\src\Eis.Web\Eis.Web.csproj

浏览器仍访问 http://127.0.0.1:4173

  • GET /health/live:只检查 ASP.NET Core 宿主。
  • GET /health/migration:检查迁移宿主和旧 API 转发链路。

可通过配置 LegacyNode:Enabled=false 禁用兼容转发;此时尚未迁移的 API 会返回 501

认证域的 ASP.NET Core 原生实现已经覆盖 /api/auth/*,包括现有 PBKDF2 密码、hz_session Cookie、登录挑战、TOTP、防重放、恢复码和自主注册。迁移期间默认仍由 Node 处理认证;显式设置以下变量后切换到原生实现:

$env:AUTH_NATIVE_ENABLED = 'true'

开发环境未配置 Redis 时可以使用进程内状态独立验证原生认证。生产环境以及仍需访问 Node 受保护接口的联调环境必须配置 REDIS_URLREDIS_SESSION_URL;两个运行时会复用相同逻辑库和 exam-information:auth 键前缀,从而共享登录会话。GET /health/migration 会报告 authentication.nativeEnabled、状态后端和跨运行时会话共享能力。

考生域全部端点(首页、通知、个人资料读取与提交、可报名考试、我的报名读取与提交、成绩与总分排名、成绩单防伪码、成绩复议、准考证下载、志愿填报与录取查询)可通过以下开关原生运行;该开关必须与原生认证及共享 Redis 同时启用:

$env:AUTH_NATIVE_ENABLED = 'true'
$env:CANDIDATE_NATIVE_ENABLED = 'true'

管理后台第一至十三批已经覆盖基础读取、组织账户、批量建号、流程定义与收件箱、通知公示、考点审批、报名缴费、考试维护、准考证编排和成绩管理。第十四批补齐指标资格确认、招生学校账号、志愿设置、招生计划审核、分数优先投档、逐轮录取公示、报到补录审批、退档监督和成绩预览提交;管理后台、审批流及考务编排的业务 API 至此全部由 ASP.NET Core 原生处理。

Excel、文书和缓存阶段已经完成:

  • ClosedXML 原生处理班级、管理员、报名号配额及结果、考生、缴费、考点考场、成绩、志愿、录取、报到和正式录取名册工作簿;模板保留必填提示、数据验证、冻结标题、筛选与数值格式。
  • 成绩 Excel 上传先生成预检结果,不直接发布成绩;报到 Excel 只更新本校当前可维护批次,并返回逐行变更摘要。
  • 录取通知书模板由 ASP.NET Core 原生读取与保存;成绩单、准考证和录取通知书继续由现有前端排版导出,但其业务数据、防伪码和验真接口均已脱离 Node.js。
  • 公开首页和考生成绩改用 Redis 命名空间版本缓存;Redis 未配置或暂不可用时使用有界进程内缓存。考试、组织、通知、招生和成绩写入后会立即失效对应命名空间,GET /health/migration 会报告缓存状态。

管理端各功能域均可独立切换;在兼容运行期仍要求原生认证和共享 Redis:

$env:AUTH_NATIVE_ENABLED = 'true'
$env:ADMIN_NATIVE_READS_ENABLED = 'true'
$env:ADMIN_NATIVE_ORGANIZATION_WRITES_ENABLED = 'true'
$env:ADMIN_NATIVE_ACCOUNT_BATCHES_ENABLED = 'true'
$env:ADMIN_NATIVE_CONFIGURATION_ENABLED = 'true'
$env:ADMIN_NATIVE_NOTICE_MANAGEMENT_ENABLED = 'true'
$env:ADMIN_NATIVE_CENTERS_ENABLED = 'true'
$env:ADMIN_NATIVE_OPERATIONAL_READS_ENABLED = 'true'
$env:ADMIN_NATIVE_CANDIDATE_MANAGEMENT_ENABLED = 'true'
$env:ADMIN_NATIVE_REGISTRATION_PAYMENT_WRITES_ENABLED = 'true'
$env:ADMIN_NATIVE_WORKFLOW_OPERATIONS_ENABLED = 'true'
$env:ADMIN_NATIVE_EXAM_MANAGEMENT_ENABLED = 'true'
$env:ADMIN_NATIVE_ARRANGEMENTS_ENABLED = 'true'
$env:ADMIN_NATIVE_RESULTS_ENABLED = 'true'
$env:ADMIN_NATIVE_ADMISSIONS_ENABLED = 'true'

旧版 ADMIN_NATIVE_NOTICE_WRITES_ENABLED 仍可作为兼容别名使用。GET /health/migration 的各 administration.native*Enabled 字段和 administration.nativeRoutes 会报告这些端点是否已切换,其中成绩与招生管理域分别对应 administration.nativeResultsEnabledadministration.nativeAdmissionsEnabled

完整的宿主、静态资源、JSON 转发和 Session Cookie 冒烟测试:

pwsh.exe -NoLogo -NoProfile -NonInteractive -File .\scripts\smoke-dotnet-migration.ps1