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

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

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

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