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