Лицензирование
Возможности, уровни лицензий и сервис лицензий
Эта страница — справочник во время выполнения о том, как лицензия определяет поведение Doconut: что позволяет каждое состояние лицензии, как предоставляются возможности и как проверить всё это из кода. (Для загрузки лицензии см. Настройка лицензии.)
Состояния лицензии и их функции
| Состояние | Открывает документы? | Водяной знак | Возможности |
|---|---|---|---|
| Полная (платная) лицензия (в рамках её периода подписки/обновления) | Да | Отсутствует | Приобретённые (Has* флаги) |
| Временная лицензия (Developer/NFR — оценочная лицензия, до даты её истечения) | Да | Отсутствует | Все — универсальное предоставление (оценочный поток) |
| Истёкшая (временная лицензия после даты истечения или платная подписка после даты продления) | Да | Оценочный водяной знак | Ничего не предоставлено |
| Отсутствует файл лицензии | Да | Оценочный водяной знак | Ничего не предоставлено |
| Найдена, но отклонена (недействительная подпись, изменена, в чёрном списке или сборка новее окна версии лицензии) | Нет — LicenseException при каждом открытии | — | — |
Две важные выводы:
- Отсутствие лицензии не является временной лицензией. При отсутствии файла лицензии страницы отображаются с водяным знаком, и ни одна возможность (поиск, аннотации, плагины) не активна. Полнофункциональный опыт без водяного знака требует реальной Временной лицензии (получить одну).
- Только отклонённая лицензия блокирует открытие. Истечение срока подписки приводит к отображению с водяным знаком; однако развертывание сборки новее, чем окно версии лицензии, отклоняется и быстро завершается с
LicenseException, поэтому вы ловите её при деплое — а не получаете тихо водяной знак в продакшн‑выводе. Это исключение (изOpenDocumentAsync) содержит причину изLicense.RejectionMessage.
Возможности
Doconut ограничивает дополнительный функционал с помощью capability. На данный момент это подключаемые модули 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* флаги и имеет default-deny для всего, что не сопоставлено. (Устаревший файл типа TRIAL не является правом — он рассматривается как без лицензии: водяной знак, ничего не предоставлено.)
Временные лицензии
Временные (Developer/NFR) лицензии отмечаются тегом ExpiryNote и имеют жёсткую дату истечения:
| Элемент | Значение |
|---|---|
IsTemporary | Присутствует тег ExpiryNote (обнаружение происходит по наличию тега — никогда не сравнивайте текст заметки, он динамический) |
ExpiryNote | Информационный текст, встроенный в лицензию |
LicenseExpiry | Жёсткая дата истечения (DateTime?) |
Семантика истечения различается по уровням: временная лицензия истекает только в дату, указанную в LicenseExpiry (окно подписки игнорируется; временная лицензия без даты считается истёкшей, безопасный режим). Все остальные лицензии истекают по дате их окна подписки/обновления.
Ссылка на IDoconutLicenseService
Разрешите IDoconutLicenseService (пространство имён Doconut.Core.Interfaces) из DoconutHost.Services. Это singleton — лицензия парсится один раз, в DoconutHost.Initialize:
| Элемент | Значение |
|---|---|
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.
// GET /Features - feature-flag your UI from the same source of truth the SDK uses
public ActionResult Index()
{
var lic = Doconut.DoconutHost.Services.GetRequiredService<IDoconutLicenseService>();
return Json(new
{
viewer = lic.IsViewerLicensed || lic.IsTemporary,
search = lic.IsCapabilityGranted(LicenseCapability.Search),
annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
conversion = lic.HasConverter,
dicom = lic.HasDicom,
}, JsonRequestBehavior.AllowGet);
}Проверка состояния
Doconut регистрирует проверку состояния "doconut", которая сообщает о состоянии лицензии. Классический ASP.NET не имеет собственного эндпоинта здоровья, поэтому откройте его через контроллер:
// GET /Health - Doconut registers a "doconut" health check that reports the license state:
// Healthy (valid), Degraded (trial or no license file), Unhealthy (expired).
public async Task<ActionResult> Index()
{
var health = Doconut.DoconutHost.Services.GetRequiredService<HealthCheckService>();
HealthReport report = await health.CheckHealthAsync();
Response.StatusCode = report.Status == HealthStatus.Unhealthy ? 503 : 200;
return Content(report.Status.ToString(), "text/plain");
}Подключите его к вашей системе мониторинга, и истекающая подписка будет генерировать оповещение вместо заявки в поддержку. См. DoconutHost для значений статуса.
Обновления версии
Лицензия покрывает окно версии. Обновление пакета NuGet до сборки новее, чем это окно, делает лицензию недействительной для данной сборки: IsVersionValid становится false, и открытие блокируется с LicenseException (причина находится в License.RejectionMessage) — преднамеренно «fail‑fast», чтобы устаревшая или без лицензии сборка была обнаружена при деплое, а не тихо водяным знаком в продакшн‑выводе. Обновите подписку, замените файл .lic в wwwroot и перезапустите пул приложений, чтобы DoconutHost.Initialize загрузил новую лицензию.
Была ли эта страница полезной?