Ліцензування

Можливості, рівні ліцензій та сервіс ліцензування

Ця сторінка є довідником під час виконання щодо того, як ліцензія формує поведінку Doconut: що дозволяє кожен стан ліцензії, як надаються можливості та як перевірити все це з коду. (Для завантаження ліцензії дивіться «Початок роботи → Налаштування ліцензії».)

Стани ліцензії та їх функції

СтанВідкриває документи?Водяний знакМожливості
Повна (платна) ліцензія (в межах її періоду підписки/оновлення)ТакНемаєТі, що придбано (Has* прапорці)
Тимчасова ліцензія (Developer/NFR — оцінювальна ліцензія, до дати закінчення терміну)ТакНемаєВсі — загальне надання (оціночна воронка)
Прострочена (тімчасова ліцензія після дати закінчення терміну, або платна підписка після дати оновлення)ТакВодяний знак оцінкиНічого не надано
Відсутній файл ліцензіїТакВодяний знак оцінкиНічого не надано
Знайдено, але відхилено (недійсний підпис, підробка, у чорному списку, або збірка новіша за вікно версії ліцензії)Ні — LicenseException при кожному відкритті——

Дві наслідки, які варто усвідомити:

  • Відсутня ліцензія не є тимчасовою ліцензією. При відсутності файлу ліцензії сторінки відображаються з водяним знаком, і жодна можливість (пошук, анотація, плагіни) не активна. Повнофункціональний, безводяний досвід вимагає реальної Тимчасової ліцензії (отримати одну).
  • Лише відхилена ліцензія блокує відкриття. Закінчення терміну календаря/підписки призводить до відображення з водяним знаком; проте розгортання збірки новішої, ніж вікно версії ліцензії відхиляється і швидко завершується з LicenseException, тому ви ловите її під час розгортання — а не тихо відправляючи водяний вихід. Це виключення (з OpenDocumentAsync) містить причину з License.RejectionMessage.

Можливості

Doconut контролює додаткову функціональність за допомогою можливості. Сьогодні це підключувані плагіни Converter та DICOM, а також вбудовані функції Search і Annotation, кожна з яких надається вашою ліцензією. Базовий переглядач не є можливістю — це передумова, представлена як IsViewerLicensed:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's version

Єдиний контроль, який використовує весь конвеєр, — це IsCapabilityGranted:

csharp
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.

csharp
// 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:

csharp
app.MapHealthChecks("/health");

Підключіть її до вашого моніторингу, і закінчення підписки стане сповіщенням, а не заявкою в службу підтримки.

Оновлення версій

Ліцензія охоплює вікно версії. Оновлення пакету NuGet до збірки новішої, ніж це вікно робить ліцензію недійсною для даної збірки: IsVersionValid стає false і відкриття блокується з LicenseException (причина в License.RejectionMessage) — навмисне швидке завершення, щоб застаріла або неліцензована збірка була виявлена під час розгортання, а не тихо водяним знаком у продуктивному виводі. Оновіть підписку, замініть .lic і перезапустіть застосунок, щоб AddDoconut() завантажив нову ліцензію.

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