Лицензирование
Возможности, уровни лицензий и сервис лицензий
Эта страница является справочником во время выполнения о том, как лицензия влияет на поведение Doconut: что позволяет каждое состояние лицензии, как предоставляются возможности и как проверить всё это из кода. (Для загрузки лицензии см. Руководство → Настройка лицензии.)
Состояния лицензий и их функции
| Состояние | Открывает документы? | Водяной знак | Возможности |
|---|---|---|---|
| Полная (платная) лицензия (в пределах её окна подписки/обновления) | Да | Нет | Приобретённые (Has* flags) |
| Временная лицензия (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* и имеет по умолчанию отказ для любого не сопоставленного. (Устаревший файл типа 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() загрузил новую лицензию.
Была ли эта страница полезной?