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

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

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

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

СтанВідкриває документи?Водяний знакМожливості
Повна (платна) ліцензія (в межах її вікна підписки/оновлення)ТакНемаєТі, що придбано (Has* flags)
Тимчасова ліцензія (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‑legacy не є правом — його розглядають як неліцензований: з водяним знаком, нічого не надано.)

Тимчасові ліцензії

Тимчасові (Developer/NFR) ліцензії позначаються тегом ExpiryNote і мають жорстку дату закінчення:

ПолеЗначення
IsTemporaryТег ExpiryNote присутній (виявлення за наявністю тегу — ніколи не порівнювати текст нотатки, вона динамічна)
ExpiryNoteІнформаційний текст, вбудований у ліцензію
LicenseExpiryЖорстка дата закінчення (DateTime?)

Семантика закінчення залежить від рівня: тимчасова ліцензія закінчується лише на дату LicenseExpiry (тільки дата) (вікно підписки ігнорується; тимчасова ліцензія без дати розглядається як прострочена, безпечний режим). Усі інші ліцензії закінчуються за датою їхнього вікна підписки/оновлення.

Довідник IDoconutLicenseService

Впровадьте IDoconutLicenseService (простір імен Doconut.Core.Interfaces; зареєстровано як singleton — ліцензія аналізується один раз під час запуску):

ЧленЗначення
LicenseПовний знімок DoconutLicenseInfo (нижче)
IsTrialФайл типу TRIAL‑legacy (розглядається як неліцензований — не є правом)
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() завантажив нову ліцензію.

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