许可

功能、许可证层级与许可证服务

本页是关于许可证如何影响 Doconut 行为的运行时参考:每种许可证状态允许的功能、能力如何被授予,以及如何在代码中检查所有这些。(有关加载许可证,请参见 入门 → 许可证设置。)

许可证状态及其作用

状态是否打开文档?水印功能
完整(付费)许可证(在其订阅/更新窗口内)已购买的(Has* 标志)
临时许可证(开发者/NFR — 评估许可证,未到期前)全部 — 统一授予(评估渠道)
已过期(临时许可证已过期,或付费订阅已到续订日期)评估水印未授予任何功能
没有许可证文件评估水印未授予任何功能
已找到但被拒绝(签名无效、被篡改、列入黑名单,或构建版本高于许可证的版本窗口)否 — 每次打开时抛出 LicenseException

两个值得牢记的后果:

  • 缺少许可证并不等同于临时许可证。 没有许可证文件时,页面会带水印渲染,且没有任何功能(搜索、注释、插件)被激活。完整、无水印的体验需要实际的 临时许可证获取一个)。
  • 只有被拒绝的许可证会阻止打开。 日历/订阅到期会降级为带水印渲染;但部署一个 高于 许可证版本窗口的构建会被拒绝,并以 LicenseException 快速失败,因此你会在部署时捕获到它,而不是悄悄地发布带水印的输出。该异常(来自 OpenDocumentAsync)携带 License.RejectionMessage 中的原因。

功能

Doconut 通过 功能(capability)来控制可选功能。当前包括可选的 ConverterDICOM 插件以及内置的 SearchAnnotation 功能,均由许可证授予。基础查看器不是功能——它是前置条件,以 IsViewerLicensed 形式呈现:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's version

整个管线使用的唯一门控是 IsCapabilityGranted

csharp
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);

其逻辑直接取自实现:一个有效(未过期)的 临时 许可证会授予 所有 功能——包括尚未有专属购买标志的功能;真实的付费许可证仅授予其 Has* 标志对应的功能,未映射的功能默认 拒绝。(旧的 TRIAL 类型文件 不是 权益——它被视为未授权:带水印,未授予任何功能。)

临时许可证

普通的 Search 和 Annotation 直接使用其已有的功能。

临时(开发者/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 向管理面板公开友好的显示快照:OwnerEmailLicenseTypeDomainIsLicenseFileFoundIsVersionValidIsTrialIsExpired、各 Has* 标志、临时许可证字段以及 RejectionMessage

csharp
// 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 机制报告许可证/到期状态:

csharp
app.MapHealthChecks("/health");

将其接入监控后,订阅即将到期时会触发警报,而不是产生支持工单。

版本升级

许可证覆盖一个 版本窗口。将 NuGet 包升级到 高于 该窗口的构建会使许可证对该构建失效:IsVersionValid 变为 false,并以 LicenseException 阻止打开(原因在 License.RejectionMessage 中)——故意快速失败,以便在部署时捕获陈旧或未授权的构建,而不是悄悄地对生产输出加水印。续订订阅、替换 .lic,并重启应用,使 AddDoconut() 加载新许可证。

此页面有帮助吗?