Налаштування ліцензії
Де Doconut шукає ваш файл ліцензії
Без ліцензії Doconut все ще відображає документи — кожна сторінка лише містить водяний знак оцінки. Ця сторінка охоплює чотири способи надання ліцензії та точний порядок пріоритету, коли встановлено більше одного.
Чотири способи надання ліцензії
Існує чотири: три явних джерела в DoconutOptions — потік, сирий вміст або шлях до файлу — плюс автоматичне виявлення, коли жодне з них не встановлено. Коли встановлено більше одного, пріоритет такий:
LicenseStream має пріоритет над LicenseContent, який має пріоритет над LicensePath, який має пріоритет над автоматичним пошуком.
За шляхом
LicensePath передається у File.Exists точно так, як вказано. Відносний шлях розв’язується відносно поточної робочої директорії процесу — а не вашої папки проєкту і не папки, в якій знаходиться Program.cs. Якщо шлях не розв’язується, Doconut не генерує виключення і не переходить до автоматичного пошуку — просто не завантажує ліцензію, і переглядач додає водяний знак. Автоматичний пошук виконується лише коли жодне з LicensePath, LicenseContent або LicenseStream не встановлено.
Надавайте перевагу абсолютному шляху (наприклад, сформованому з IWebHostEnvironment.WebRootPath або AppContext.BaseDirectory), або повністю пропустіть LicensePath і покладіться на автоматичне виявлення нижче.
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "Doconut.Viewer.lic");
});За потоком
LicenseStream читається один раз під час запуску — корисно, коли ліцензія надходить із сховища секретів, а не з файлу на диску.
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});За вмістом
LicenseContent приймає сам текст ліцензії — з змінної середовища, бази даних або менеджера секретів:
// License XML from a database, environment variable, or secret manager —
// no file on disk. Beaten only by LicenseStream.
builder.Services.AddDoconut(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});Автоматичне виявлення
Не налаштовуйте жодне з трьох явних джерел, і Doconut сам шукає ліцензію:
// Configure nothing, and Doconut searches for the license itself:
// 1. {CurrentDirectory}/wwwroot
// 2. {CurrentDirectory}/wwwroot/lib
// 3. AppContext.BaseDirectory (the build output folder)
// It looks for Doconut.Viewer.lic plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
builder.Services.AddDoconut();Пробні каталоги, у зазначеному порядку, та імена файлів, які шукаються в кожному з них:
1. {CurrentDirectory}/wwwroot
2. {CurrentDirectory}/wwwroot/lib
3. AppContext.BaseDirectory
Назви файлів (перевіряються у кожному каталозі вище, у зазначеному порядку):
Doconut.Viewer.lic — base viewer license
Doconut.Viewer.<Capability>.lic — per-plugin license, alongside Doconut.Viewer.licСкопіюйте ліцензію у вашу вихідну папку
LicensePath і пробний шлях AppContext.BaseDirectory автоматичного пошуку обидва потребують, щоб файл .lic існував поруч із зібраним застосунком — а не лише у вашій вихідній папці wwwroot. Тестовий застосунок SDK копіює його при кожному збірці за допомогою цього MSBuild‑цілі:
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
</ItemGroup>
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>Тримайте файли
.licпоза системою контролю версій — розгорніть їх разом із застосунком або впровадьте ліцензію черезLicenseContentабоLicenseStreamіз вашого сховища секретів.
Що відбувається без ліцензії
Відсутня ліцензія не викликає виключення. AddDoconut() успішно виконується, застосунок стартує, і переглядач працює — проте кожна сторінка має водяний знак оцінки і жодна додаткова можливість не надається.
Файл ліцензії, який знайдено, але відхилено, — це інша ситуація. Неправильний підпис, підробка, чорний список або збірка поза часовим вікном ліцензії призводять до того, що OpenDocumentAsync генерує LicenseException з License.RejectionMessage. Календарно прострочена ліцензія без повідомлення про відхилення продовжує працювати у режимі з водяним знаком.
Плагінам потрібні можливості
Реєстрація плагіна без відповідного дозволу — інша ситуація: для відсутньої ліцензії, застарілого файлу TRIAL або платної ліцензії без цієї можливості AddDoconut() генерує InvalidOperationException, і застосунок не стартує. Приклад: реєстрація плагіна Converter без ліцензії, що надає Converter:
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.Повідомлення одразу підказує, як виправити: або видаліть виклик options.AddPlugin<...>() для цього плагіна, або встановіть платну ліцензію чи активну тимчасову/демо (NFR) ліцензію, яка надає цю можливість. Тимчасові реєстрації дозволено залишатися після закінчення терміну, щоб вже налаштований застосунок міг працювати в обмеженому режимі, а не падати під час перезапуску; після закінчення терміну їхні можливості все одно відкликаються.
Перевірте завантажену ліцензію
Використовуйте IDoconutLicenseService, той самий джерело правди, що й SDK, щоб надати автентифікований діагностичний кінцевий пункт або керувати функціональними прапорцями. Не повертайте вміст ліцензії чи ключі.
app.MapGet("/api/doconut/license", (IDoconutLicenseService license) => Results.Ok(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
}));Ліцензію читають під час реєстрації AddDoconut(). ResetLicense наразі є властивістю сумісності без активного шляху перезавантаження, тому заміна файлу ліцензії вимагає перезапуску застосунку.
Матриця усунення проблем
| Симптом | Ймовірна причина | Перевірка |
|---|---|---|
| Переглядач працює, але кожна сторінка має водяний знак | Ліцензія не завантажена, або ліцензія прострочена за календарем | Отримайте IDoconutLicenseService; перевірте вихідний каталог і робочий каталог процесу |
AddDoconut() викликає виключення для плагіна | Ліцензія не надає можливість цього плагіна | Перевірте IsCapabilityGranted(...) і видаліть реєстрації, які ви не придбали |
| Налаштований відносний шлях працює локально, але не в IIS/контейнері | Змінений робочий каталог процесу | Використовуйте AppContext.BaseDirectory або абсолютний шлях |
Замінений файл .lic не має ефекту | Сервіс ліцензії-синглтон вже був створений | Перезапустіть застосунок |
OpenDocumentAsync викликає LicenseException | Підпис, домен, вікно версії, чорний список або перевірка під час виконання плагіна відхилили ліцензію | Прочитайте повідомлення про виключення/відхилення, не розкриваючи його недовіреним клієнтам |
Наступні кроки
- Ліцензування — можливості, рівні ліцензій та перевірка того, що завантажено під час виконання.
- Усунення проблем — водяні знаки, відхилені ліцензії та помилки можливостей.
Чи була ця сторінка корисною?