Лицензирование

Возможности, уровни лицензий и сервис лицензий

Эта страница является справочником во время выполнения о том, как лицензия влияет на поведение 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* и имеет по умолчанию отказ для любого не сопоставленного. (Устаревший файл типа 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() загрузил новую лицензию.

Была ли эта страница полезной?