Ліцензування
Можливості, рівні ліцензій та сервіс ліцензування
Ця сторінка є довідником під час виконання щодо того, як ліцензія формує поведінку Doconut: що дозволяє кожен стан ліцензії, як надаються можливості та як перевірити все це з коду. (Для завантаження ліцензії дивіться «Початок роботи → Налаштування ліцензії».)
Стани ліцензії та їх функції
| Стан | Відкриває документи? | Водяний знак | Можливості |
|---|---|---|---|
| Повна (платна) ліцензія (в межах її періоду підписки/оновлення) | Так | Немає | Ті, що придбано (Has* прапорці) |
| Тимчасова ліцензія (Developer/NFR — оцінювальна ліцензія, до дати закінчення терміну) | Так | Немає | Всі — загальне надання (оціночна воронка) |
| Прострочена (тімчасова ліцензія після дати закінчення терміну, або платна підписка після дати оновлення) | Так | Водяний знак оцінки | Нічого не надано |
| Відсутній файл ліцензії | Так | Водяний знак оцінки | Нічого не надано |
| Знайдено, але відхилено (недійсний підпис, підробка, у чорному списку, або збірка новіша за вікно версії ліцензії) | Ні — LicenseException при кожному відкритті | — | — |
Дві наслідки, які варто усвідомити:
- Відсутня ліцензія не є тимчасовою ліцензією. При відсутності файлу ліцензії сторінки відображаються з водяним знаком, і жодна можливість (пошук, анотація, плагіни) не активна. Повнофункціональний, безводяний досвід вимагає реальної Тимчасової ліцензії (отримати одну).
- Лише відхилена ліцензія блокує відкриття. Закінчення терміну календаря/підписки призводить до відображення з водяним знаком; проте розгортання збірки новішої, ніж вікно версії ліцензії відхиляється і швидко завершується з
LicenseException, тому ви ловите її під час розгортання — а не тихо відправляючи водяний вихід. Це виключення (зOpenDocumentAsync) містить причину зLicense.RejectionMessage.
Можливості
Doconut контролює додаткову функціональність за допомогою можливості. Сьогодні це підключувані плагіни Converter та DICOM, а також вбудовані функції Search і Annotation, кожна з яких надається вашою ліцензією. Базовий переглядач не є можливістю — це передумова, представлена як IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionЄдиний контроль, який використовує весь конвеєр, — це IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);Його логіка, дослівно з реалізації: активна (не прострочена) Тимчасова ліцензія надає кожну можливість — включаючи можливості, які ще не мають окремого прапорця покупки; реальна придбана ліцензія надає саме свої прапорці Has* і має default-deny для будь‑якого непов’язаного. (Файл старого типу TRIAL не є правом — його розглядають як неліцензований: з водяним знаком, нічого не надано.)
Тимчасові ліцензії
Звичайний пошук та анотація використовують свої існуючі можливості безпосередньо.
Тимчасові (Developer/NFR) ліцензії позначені тегом ExpiryNote і мають жорстку дату закінчення терміну:
| Член | Значення |
|---|---|
IsTemporary | Тег ExpiryNote присутній (виявлення за наявністю тегу — ніколи не порівнювати текст нотатки, вона динамічна) |
ExpiryNote | Інформаційний текст, вбудований у ліцензію |
LicenseExpiry | Жорстка дата закінчення (DateTime?) |
Семантика закінчення терміну залежить від рівня: тимчасова ліцензія закінчується лише на дату LicenseExpiry (тільки дата) (вікно підписки ігнорується; тимчасова ліцензія без дати розглядається як прострочена, безпечний режим). Всі інші ліцензії закінчуються за датою їхнього вікна підписки/оновлення.
Довідка IDoconutLicenseService
Впровадьте IDoconutLicenseService (простір імен Doconut.Core.Interfaces; зареєстровано як singleton — ліцензію розбирають один раз під час запуску):
| Член | Значення |
|---|---|
License | Повний знімок DoconutLicenseInfo (нижче) |
IsTrial | Файл старого типу TRIAL (розглядається як неліцензований — не право) |
IsTemporary / ExpiryNote / LicenseExpiry | Маркери тимчасової ліцензії |
IsExpired | Прострочена згідно правил рівнів вище |
IsVersionValid | Ця збірка потрапляє у вікно підтримки ліцензії |
IsViewerLicensed | Файл, не TRIAL, знайдено і версія покрита — базова передумова |
IsCapabilityGranted(cap) | Єдиний контроль можливості |
HasSearch HasAnnotation HasConverter HasDicom | Випущені згідно прапорців покупки на кожну можливість — використовуйте IsCapabilityGranted для відповіді, що враховує тимчасову ліцензію |
IsValidForDomain(host) | Покриття хоста; ліцензії V4 використовують шаблон *.* |
LicenseRejectionReason | Непорожнє ⇒ відкриття блокується цим повідомленням |
DoconutLicenseInfo надає зручний для відображення знімок для адмін-панелей: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, прапорці Has*, поля тимчасової ліцензії та RejectionMessage.
// 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:
app.MapHealthChecks("/health");Підключіть її до вашого моніторингу, і закінчення підписки стане сповіщенням, а не заявкою в службу підтримки.
Оновлення версій
Ліцензія охоплює вікно версії. Оновлення пакету NuGet до збірки новішої, ніж це вікно робить ліцензію недійсною для даної збірки: IsVersionValid стає false і відкриття блокується з LicenseException (причина в License.RejectionMessage) — навмисне швидке завершення, щоб застаріла або неліцензована збірка була виявлена під час розгортання, а не тихо водяним знаком у продуктивному виводі. Оновіть підписку, замініть .lic і перезапустіть застосунок, щоб AddDoconut() завантажив нову ліцензію.
Чи була ця сторінка корисною?