许可
功能、许可层级和许可服务
此页面是运行时参考,说明许可证如何影响 Doconut 的行为:每种许可证状态允许的功能、功能如何被授予,以及如何在代码中检查所有这些。(有关加载许可证,请参阅 入门 → 许可证设置。)
许可证状态及其作用
| 状态 | 是否打开文档? | 水印 | 功能 |
|---|---|---|---|
| 完整(付费)许可证(在其订阅/更新窗口内) | 是 | 无 | 已购买的(Has* 标志) |
| 临时许可证(开发者/NFR — 评估许可证,在其到期日前) | 是 | 无 | 全部 — 全面授予(评估渠道) |
| 已过期(临时许可证已过期,或付费订阅已过续期) | 是 | 评估水印 | 未授予 |
| 未找到许可证文件 | 是 | 评估水印 | 未授予 |
| 已发现但被拒绝(签名无效、被篡改、列入黑名单,或构建版本高于许可证的版本窗口) | 否 — 每次打开时抛出 LicenseException | — | — |
两个值得内部化的后果:
- 缺少许可证并非临时许可证。 没有许可证文件时,页面会呈现水印,且没有任何功能(搜索、注释、插件)激活。完整功能、无水印的体验需要实际的 临时许可证(获取一个)。
- 只有被拒绝的许可证会阻止打开。 日历/订阅到期会降级为水印渲染;但部署一个 高于 许可证版本窗口的构建会被拒绝,并 快速失败,抛出
LicenseException,因此你可以在部署时捕获它——而不是悄悄发布带水印的输出。该异常(来自OpenDocumentAsync)携带来自License.RejectionMessage的原因。
功能
Doconut 通过 功能 来控制可选功能。当前这些包括可选的 Converter 和 DICOM 插件以及内置的 Search 和 Annotation 功能,均由你的许可证授予。基础查看器不是功能——它是前提条件,以 IsViewerLicensed 形式呈现:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's version整个管道使用的唯一门控是 IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);其逻辑直接取自实现:一个有效的(未过期)临时许可证授予 所有 功能——包括尚未拥有专用购买标志的功能;真实的付费许可证仅授予其 Has* 标志对应的功能,并对未映射的功能采用 默认拒绝。 (旧版 TRIAL 类型文件 不是 权益——它被视为未授权:带水印,未授予任何功能。)
临时许可证
临时(Developer/NFR)许可证通过 ExpiryNote 标记,并携带硬性到期日期:
| 成员 | 含义 |
|---|---|
IsTemporary | 存在 ExpiryNote 标记(检测方式为标签存在——永不匹配注释文本,它是动态的) |
ExpiryNote | 许可证中嵌入的信息文本 |
LicenseExpiry | 硬性到期日期(DateTime?) |
到期语义因层级而异:临时许可证仅在其 LicenseExpiry 日期 到期(其订阅窗口被忽略;缺少日期的临时许可证视为已过期,安全失效)。其他所有许可证在其订阅/更新窗口日期到期。
IDoconutLicenseService 参考
注入 IDoconutLicenseService(命名空间 Doconut.Core.Interfaces;以单例方式注册——许可证在启动时解析一次):
| 成员 | 含义 |
|---|---|
License | 完整的 DoconutLicenseInfo 快照(如下) |
IsTrial | 旧版 TRIAL 类型文件(视为未授权——不是权益) |
IsTemporary / ExpiryNote / LicenseExpiry | 临时许可证标记 |
IsExpired | 根据上述层级规则已过期 |
IsVersionValid | 此构建位于许可证的支持窗口内 |
IsViewerLicensed | 找到非 TRIAL 文件 且 版本受覆盖——基础前提条件 |
IsCapabilityGranted(cap) | 唯一的功能门控 |
HasSearch HasAnnotation HasConverter HasDicom | 根据每项功能的购买标志发布——使用 IsCapabilityGranted 获取考虑临时许可证的答案 |
IsValidForDomain(host) | 主机覆盖;V4 许可证使用通配符 *.* |
LicenseRejectionReason | 非空 ⇒ 打开被此消息阻止 |
DoconutLicenseInfo 提供面向显示的快照供管理面板使用:Owner、Email、LicenseType、Domain、IsLicenseFileFound、IsVersionValid、IsTrial、IsExpired、Has* 标志、临时许可证字段以及 RejectionMessage。
// Feature-flag your UI from the same source of truth the SDK uses
app.MapGet("/api/features", (IDoconutLicenseService lic) => Results.Ok(new
{
viewer = lic.IsViewerLicensed || lic.IsTemporary,
search = lic.IsCapabilityGranted(LicenseCapability.Search),
annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
conversion = lic.HasConverter,
dicom = lic.HasDicom,
}));健康检查
AddDoconut() 注册一个 "doconut" 健康检查,通过标准的 ASP.NET Core 机制报告许可证/到期状态:
app.MapHealthChecks("/health");将其接入你的监控系统,过期的订阅将变为警报,而不是支持工单。
版本升级
许可证覆盖一个 版本窗口。将 NuGet 包更新到 高于 该窗口的构建会使许可证对该构建无效:IsVersionValid 变为 false,并 阻止打开,抛出 LicenseException(原因在 License.RejectionMessage 中)——有意快速失败,以便在部署时捕获陈旧或未授权的构建,而不是悄悄在生产输出上加水印。续订订阅,替换 .lic,并重启应用程序,使 AddDoconut() 加载新许可证。
此页面有帮助吗?