Skip to the content.

面板的宿主边界与计划观察

面板的 HTTP 层只投影 IJobStore,不参与领取、执行或数据库事务。任务 Scope 由宿主回调从认证上下文取得,放入当前请求状态,全部读取和操作都使用同一值。详情和历史在返回前核对任务归属,未知和其他 Scope 的 ID 均不可见。

默认授权策略作用于整组 API,控制和计划查看可以再叠加独立策略。防伪检查使用 ASP.NET Core IAntiforgery;session 生成与身份、Cookie 绑定的令牌,POST 验证后才调用存储。宿主保留防伪配置所有权,HeaderName 不可为空。API 返回 no-store,不暴露载荷或执行令牌。

页面、样式和脚本使用嵌入资源,由同一路由组返回,不依赖宿主 wwwroot。挂载入口补齐末尾斜杠,静态资源与 API 均用相对 URL,兼容 PathBase。页面默认跟随宿主授权;AllowAnonymousShell 只开放固定空壳及静态资源。CSP 仅允许同源脚本、样式和连接,所有服务器数据用 textContent 写入 DOM,不拼入 HTML 或脚本。

面板数据使用组件自己的 Web JSON 契约,避免宿主修改属性命名或枚举格式后使内嵌页面失效。它不修改宿主全局 JSON 选项。Bearer 令牌只在脚本闭包内保留,防伪 Cookie 仍由 ASP.NET Core 管理;pagehide 清空连接,浏览器从页面缓存返回时重新认证。

异步读取绑定连接版本,切换身份会中止旧请求并清空输入、详情、列表和统计;迟到响应不能重新填充旧身份数据。详情请求另有递增序号,避免快速选择多个任务时较早响应覆盖新选择。刷新串行化并合并重复刷新需求,变更操作后恢复按钮状态;界面允许操作不替代服务器的权限、防伪和状态检查。

任务列表复用现有有界 ListAsync,取 K+1 判断是否还有更早记录;不为 UI 新增全库计数、排序或扫描。统计基于返回窗口,明确保留可见范围。任务状态竞争仍由存储处理:按钮显示只是提示,旧页面上的操作可能返回 409,UI 应刷新。

Coravel 6.0.2 的公开 IScheduler 提供注册入口,但没有计划枚举。观察器实现同一公开接口,每次先调用原生方法,成功后才记录对应参数或约束。日/周/月、Cron、秒刻度、时区、worker、重叠控制及一次性配置继续交给原生对象;观察器只记录展示信息,不解析 Cron,不执行 When,不保留构造参数或委托闭包。

计划记录用锁保护更新和快照复制,避免并发读取可变集合。目录描述注册时的配置,而不是原生活动任务清单;Once 执行后自动移除、其他代码直接注册或取消计划都不能被该版本的公开接口完整观察。页面必须使用“注册计划”措辞,不展示猜测的活动状态或下一次执行时间。改用带正式枚举接口的 Coravel 版本时,再替换该适配边界。