Налаштування ліцензії

Де Doconut шукає ваш файл ліцензії

Без ліцензії Doconut все ще відображає документи — кожна сторінка лише містить водяний знак оцінки. Ця сторінка охоплює чотири способи надання ліцензії та точний порядок пріоритету, коли встановлено більше одного.

Чотири способи надання ліцензії

Існує чотири: три явних джерела в DoconutOptions — потік, сирий вміст або шлях до файлу — плюс автоматичне виявлення, коли жодне з них не встановлено. Коли встановлено більше одного, пріоритет такий:

LicenseStream має пріоритет над LicenseContent, який має пріоритет над LicensePath, який має пріоритет над автоматичним пошуком.

За шляхом

LicensePath передається у File.Exists точно так, як вказано. Відносний шлях розв’язується відносно поточної робочої директорії процесу — а не вашої папки проєкту і не папки, в якій знаходиться Program.cs. Якщо шлях не розв’язується, Doconut не генерує виключення і не переходить до автоматичного пошуку — просто не завантажує ліцензію, і переглядач додає водяний знак. Автоматичний пошук виконується лише коли жодне з LicensePath, LicenseContent або LicenseStream не встановлено.

Надавайте перевагу абсолютному шляху (наприклад, сформованому з IWebHostEnvironment.WebRootPath або AppContext.BaseDirectory), або повністю пропустіть LicensePath і покладіться на автоматичне виявлення нижче.

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(AppContext.BaseDirectory, "Doconut.Viewer.lic");
});

За потоком

LicenseStream читається один раз під час запуску — корисно, коли ліцензія надходить із сховища секретів, а не з файлу на диску.

csharp
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

За вмістом

LicenseContent приймає сам текст ліцензії — з змінної середовища, бази даних або менеджера секретів:

csharp
// 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 сам шукає ліцензію:

csharp
// 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();

Пробні каталоги, у зазначеному порядку, та імена файлів, які шукаються в кожному з них:

text
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‑цілі:

xml
<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:

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.

Повідомлення одразу підказує, як виправити: або видаліть виклик options.AddPlugin<...>() для цього плагіна, або встановіть платну ліцензію чи активну тимчасову/демо (NFR) ліцензію, яка надає цю можливість. Тимчасові реєстрації дозволено залишатися після закінчення терміну, щоб вже налаштований застосунок міг працювати в обмеженому режимі, а не падати під час перезапуску; після закінчення терміну їхні можливості все одно відкликаються.

Перевірте завантажену ліцензію

Використовуйте IDoconutLicenseService, той самий джерело правди, що й SDK, щоб надати автентифікований діагностичний кінцевий пункт або керувати функціональними прапорцями. Не повертайте вміст ліцензії чи ключі.

csharp
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Підпис, домен, вікно версії, чорний список або перевірка під час виконання плагіна відхилили ліцензіюПрочитайте повідомлення про виключення/відхилення, не розкриваючи його недовіреним клієнтам

Наступні кроки

  • Ліцензування — можливості, рівні ліцензій та перевірка того, що завантажено під час виконання.
  • Усунення проблем — водяні знаки, відхилені ліцензії та помилки можливостей.

Чи була ця сторінка корисною?