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

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

Эта страница — справочник во время выполнения о том, как лицензия определяет поведение Doconut: что позволяет каждое состояние лицензии, как предоставляются возможности и как проверить всё это из кода. (Для загрузки лицензии см. Настройка лицензии.)

Состояния лицензии и их функции

СостояниеОткрывает документы?Водяной знакВозможности
Полная (платная) лицензия (в рамках её периода подписки/обновления)ДаОтсутствуетПриобретённые (Has* флаги)
Временная лицензия (Developer/NFR — оценочная лицензия, до даты её истечения)ДаОтсутствуетВсе — универсальное предоставление (оценочный поток)
Истёкшая (временная лицензия после даты истечения или платная подписка после даты продления)ДаОценочный водяной знакНичего не предоставлено
Отсутствует файл лицензииДаОценочный водяной знакНичего не предоставлено
Найдена, но отклонена (недействительная подпись, изменена, в чёрном списке или сборка новее окна версии лицензии)Нет — LicenseException при каждом открытии——

Две важные выводы:

  • Отсутствие лицензии не является временной лицензией. При отсутствии файла лицензии страницы отображаются с водяным знаком, и ни одна возможность (поиск, аннотации, плагины) не активна. Полнофункциональный опыт без водяного знака требует реальной Временной лицензии (получить одну).
  • Только отклонённая лицензия блокирует открытие. Истечение срока подписки приводит к отображению с водяным знаком; однако развертывание сборки новее, чем окно версии лицензии, отклоняется и быстро завершается с LicenseException, поэтому вы ловите её при деплое — а не получаете тихо водяной знак в продакшн‑выводе. Это исключение (из OpenDocumentAsync) содержит причину из License.RejectionMessage.

Возможности

Doconut ограничивает дополнительный функционал с помощью capability. На данный момент это подключаемые модули 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* флаги и имеет 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.

csharp
// 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 не имеет собственного эндпоинта здоровья, поэтому откройте его через контроллер:

csharp
// 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 загрузил новую лицензию.

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