许可证设置
Doconut 在 IIS 下查找许可证文件的位置
即使没有许可证,Doconut 仍然可以渲染文档——每页都会带有评估水印。本页介绍在 Global.asax 中提供许可证的四种方式、当未提供许可证时 Doconut 的查找位置,以及插件许可证缺失时会发生什么。
提供许可证的四种方式
在 DoconutOptions 中有三种明确的来源——文件路径、流或原始内容——以及当它们均未设置时的自动发现。所有来源在 DoconutHost.Initialize 中只读取一次。当设置了多个时,优先级如下:
LicenseStream 胜过 LicenseContent 胜过 LicensePath 胜过 自动发现。
按路径
为 LicensePath 提供完整路径。相对路径会相对于进程的当前目录解析,在 IIS 下,这个目录是工作进程自己的文件夹,而不是站点目录。HostingEnvironment.MapPath 将站点相对路径转换为完整路径:
Doconut.DoconutHost.Initialize(options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
});如果文件不存在,Doconut 不会抛出异常,也 不会 回退到自动发现:它不会加载任何许可证,查看器会显示水印。相同文件夹中的每个插件许可证文件(Doconut.Viewer.<Capability>.lic)会随之读取,因此当插件许可证与基础许可证放在一起时,LicensePath 与 AddPlugin<...>() 可以协同工作。
按流
LicenseStream 在启动时读取一次——当许可证来自嵌入资源或机密存储而不是磁盘文件时,这非常有用。
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
Doconut.DoconutHost.Initialize(options =>
{
options.LicenseStream = licenseStream;
});按内容
LicenseContent 直接接受许可证文本——可以来自环境变量、数据库或机密存储——因此无需随站点部署许可证文件。
// 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 会自行搜索许可证:
// 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();以下是按顺序搜索的两个文件夹及其查找的文件:
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 中:
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 中抛出异常:
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 中解析它,以提供经过身份验证的诊断端点或驱动功能标记——绝不要返回许可证内容:
// 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 | 许可证已找到但被拒绝 | 读取异常信息;不要向不受信任的客户端展示 |
后续步骤
此页面对您有帮助吗?