许可证设置

Doconut 在 IIS 下查找许可证文件的位置

即使没有许可证,Doconut 仍然可以渲染文档——每页都会带有评估水印。本页介绍在 Global.asax 中提供许可证的四种方式、当未提供许可证时 Doconut 的查找位置,以及插件许可证缺失时会发生什么。

提供许可证的四种方式

在 DoconutOptions 中有三种明确的来源——文件路径、流或原始内容——以及当它们均未设置时的自动发现。所有来源在 DoconutHost.Initialize 中只读取一次。当设置了多个时,优先级如下:

LicenseStream 胜过 LicenseContent 胜过 LicensePath 胜过 自动发现。

按路径

为 LicensePath 提供完整路径。相对路径会相对于进程的当前目录解析,在 IIS 下,这个目录是工作进程自己的文件夹,而不是站点目录。HostingEnvironment.MapPath 将站点相对路径转换为完整路径:

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
});

如果文件不存在,Doconut 不会抛出异常,也 不会 回退到自动发现:它不会加载任何许可证,查看器会显示水印。相同文件夹中的每个插件许可证文件(Doconut.Viewer.<Capability>.lic)会随之读取,因此当插件许可证与基础许可证放在一起时,LicensePath 与 AddPlugin<...>() 可以协同工作。

按流

LicenseStream 在启动时读取一次——当许可证来自嵌入资源或机密存储而不是磁盘文件时,这非常有用。

csharp
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
Doconut.DoconutHost.Initialize(options =>
{
    options.LicenseStream = licenseStream;
});

按内容

LicenseContent 直接接受许可证文本——可以来自环境变量、数据库或机密存储——因此无需随站点部署许可证文件。

csharp
// License XML from a database, an environment variable or a secret store -
// no file on disk. Beaten only by LicenseStream.
Doconut.DoconutHost.Initialize(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

自动发现

如果三者都未设置,Doconut 会自行搜索许可证:

csharp
// Configure nothing, and Doconut searches for the license itself, in this order:
//   1. {CurrentDirectory}\wwwroot
//   2. {AppContext.BaseDirectory}\wwwroot   (under IIS: the site's root folder)
// It looks for Doconut.lic first, then Doconut.Viewer.lic, plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
Doconut.DoconutHost.Initialize();

以下是按顺序搜索的两个文件夹及其查找的文件:

text
1. {CurrentDirectory}\wwwroot
2. {AppContext.BaseDirectory}\wwwroot

In each folder:
  Doconut.lic                        — if found, this is the only file read
  Doconut.Viewer.lic                 — base viewer license
  Doconut.Viewer.<Capability>.lic    — per-plugin licenses, read only next to Doconut.Viewer.lic

在 IIS 和 IIS Express 下,AppContext.BaseDirectory 是 站点根文件夹——即包含 Web.config 的文件夹,而不是其 bin 文件夹。因此许可证应放在站点根目录下的 wwwroot 中:

text
MySite\
  Web.config
  Global.asax
  bin\
  wwwroot\
    Doconut.Viewer.lic
    Doconut.Viewer.Converter.lic

在项目中,将 wwwroot\*.lic 与 Web.config 放在同一位置,并随站点一起部署。无需在构建步骤中复制它们。将 .lic 放在其他位置——如 bin\、Web.config 旁边或 wwwroot 的子文件夹中——都不会被读取。

将 .lic 文件排除在源代码管理之外。将它们与站点一起部署,或通过 LicenseContent 或 LicenseStream 从机密存储提供许可证。

未提供许可证会怎样

缺少许可证不会抛出异常。DoconutHost.Initialize 成功,站点启动,查看器运行,但每页都会带有评估水印,且不会授予任何可选功能。

找到但被拒绝的许可证文件情况不同。无效的签名、篡改或超出许可证版本窗口的构建会导致 OpenDocumentAsync 抛出带有原因的 LicenseException。

插件在启动时需要许可证

注册未被任何许可证授权的插件功能会导致应用在启动时停止。DoconutHost.Initialize 在 Application_Start 中抛出异常:

text
InvalidOperationException: The Converter plugin is registered via AddPlugin but no active
license grants Converter. Remove the AddPlugin<...>() call or install a license (or
trial/demo) that includes Converter.

在 System.Web 环境下,浏览器中看不到该信息。对站点的每个请求都会返回空的 500——没有错误页面、堆栈跟踪,也没有 IIS 日志记录。该异常仅记录在 Windows 事件日志(应用程序日志,来源 ASP.NET)中。如果在添加 AddPlugin 行后站点立即停止响应,请先检查 wwwroot 中的许可证文件:插件的 Doconut.Viewer.<Capability>.lic 必须与 Doconut.Viewer.lic 放在一起,否则在缺少基础许可证的情况下,插件文件根本不会被读取。

验证已加载的许可证

IDoconutLicenseService 是 SDK 使用的同一可信来源。可从 DoconutHost.Services 中解析它,以提供经过身份验证的诊断端点或驱动功能标记——绝不要返回许可证内容:

csharp
// GET /License/Status
public ActionResult Status()
{
    var license = Doconut.DoconutHost.Services.GetRequiredService<IDoconutLicenseService>();

    return Json(new
    {
        viewer     = license.IsViewerLicensed || license.IsTemporary,
        temporary  = license.IsTemporary,
        search     = license.IsCapabilityGranted(LicenseCapability.Search),
        annotation = license.IsCapabilityGranted(LicenseCapability.Annotation),
        converter  = license.HasConverter,
        dicom      = license.HasDicom
    }, JsonRequestBehavior.AllowGet);
}

许可证在 DoconutHost.Initialize 中读取一次。更换许可证文件后,回收应用程序池(或触碰 Web.config),以便再次运行 Application_Start。

故障排除

症状可能原因检查方式
查看器工作正常,但每页都有水印未找到许可证.lic 是否位于 <site root>\wwwroot?请调用上面的状态端点
添加插件后,每个请求返回空的 500已注册的插件没有获得许可证授权Windows 事件日志,来源 ASP.NET;插件的 .lic 位于 Doconut.Viewer.lic 旁边
LicensePath 在本机上有效,但在服务器上无效相对路径解析到工作进程文件夹使用 HostingEnvironment.MapPath("~/wwwroot/...") 构建路径
更换的 .lic 文件未生效许可证在应用启动时已读取回收应用程序池
OpenDocumentAsync 抛出 LicenseException许可证已找到但被拒绝读取异常信息;不要向不受信任的客户端展示

后续步骤

  • 许可 — 功能以及如何在运行时检查它们。
  • 故障排除 — 水印、启动失败和其他症状。

此页面对您有帮助吗?