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

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

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

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