Licencias

Capacidades, niveles de licencia y el servicio de licencias

Esta página es la referencia en tiempo de ejecución de cómo una licencia define el comportamiento de Doconut: lo que permite cada estado de licencia, cómo se conceden las capacidades y cómo inspeccionar todo desde el código. (Para cargar una licencia, consulte Introducción → Configuración de Licencia.)

Estados de licencia y lo que hacen

Estado¿Abre documentos?Marca de aguaCapacidades
Licencia completa (de pago) (dentro de su ventana de suscripción/actualización)NingunaLas compradas (Has* flags)
Licencia temporal (Desarrollador/NFR — la licencia de evaluación, antes de su fecha de expiración)NingunaTodas — concesión total (el embudo de evaluación)
Expirada (una licencia temporal pasada su fecha de expiración, o una suscripción de pago pasada su fecha de renovación)Marca de agua de evaluaciónNinguna concedida
Sin archivo de licenciaMarca de agua de evaluaciónNinguna concedida
Encontrada pero rechazada (firma inválida, manipulada, en lista negra, o una compilación más reciente que la ventana de versión de la licencia)No — LicenseException en cada apertura

Dos consecuencias que vale la pena internalizar:

  • Una licencia ausente no es una licencia temporal. Sin archivo de licencia, las páginas se renderizan con marca de agua y ninguna capacidad (búsqueda, anotación, complementos) está activa. La experiencia completa, sin marca de agua, requiere una Licencia temporal (obtener una).
  • Solo una licencia rechazada bloquea la apertura. La expiración del calendario/suscripción degrada a renderizado con marca de agua; pero desplegar una compilación más reciente que la ventana de versión de la licencia es rechazado y falla rápidamente con una LicenseException, de modo que lo detectas en el despliegue — no enviando silenciosamente salida con marca de agua. Esa excepción (de OpenDocumentAsync) lleva la razón de License.RejectionMessage.

Capacidades

Doconut controla la funcionalidad opcional mediante capacidad. Hoy son los complementos opcionales Converter y DICOM, además de las funciones integradas Search y Annotation, cada una concedida por su licencia. El visor base no es una capacidad — es el requisito previo, expuesto como IsViewerLicensed:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's version

La única puerta que usa todo el pipeline es IsCapabilityGranted:

csharp
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);

Su lógica, literalmente de la implementación: una licencia Temporal activa (no expirada) concede todas las capacidades — incluidas aquellas que aún no tienen una bandera de compra dedicada; una licencia comprada real concede exactamente sus banderas Has* y es denegación por defecto para cualquier cosa no mapeada. (Un archivo legado de tipo TRIAL no es un derecho — se trata como sin licencia: con marca de agua, nada concedido.)

Licencias temporales

La búsqueda y anotación normales usan sus capacidades existentes directamente.

Las licencias temporales (Desarrollador/NFR) se marcan con una etiqueta ExpiryNote y llevan una fecha de expiración rígida:

MiembroSignificado
IsTemporaryExiste una etiqueta ExpiryNote (la detección se basa en la presencia de la etiqueta — nunca coincida con el texto de la nota, es dinámico)
ExpiryNoteTexto informativo incrustado en la licencia
LicenseExpiryLa fecha de expiración rígida (DateTime?)

La semántica de expiración difiere por nivel: una licencia temporal expira en su solo la fecha LicenseExpiry (se ignora su ventana de suscripción; una licencia temporal sin fecha se trata como expirada, a prueba de fallos). Todas las demás licencias expiran en su fecha de ventana de suscripción/actualización.

Referencia de IDoconutLicenseService

Inyecte IDoconutLicenseService (espacio de nombres Doconut.Core.Interfaces; registrado como singleton — la licencia se analiza una vez al iniciar):

MiembroSignificado
LicenseInstantánea completa de DoconutLicenseInfo (abajo)
IsTrialUn archivo legado de tipo TRIAL (tratado como sin licencia — no es un derecho)
IsTemporary / ExpiryNote / LicenseExpiryMarcadores de licencia temporal
IsExpiredExpirada según las reglas de nivel anteriores
IsVersionValidEsta compilación está dentro de la ventana de soporte de la licencia
IsViewerLicensedArchivo no TRIAL encontrado y versión cubierta — requisito base
IsCapabilityGranted(cap)La única puerta de capacidad
HasSearch HasAnnotation HasConverter HasDicomBandera de compra por capacidad — use IsCapabilityGranted para la respuesta consciente de temporales
IsValidForDomain(host)Cobertura de host; licencias V4 usan el comodín *.*
LicenseRejectionReasonNo vacío ⇒ la apertura está bloqueada con este mensaje

DoconutLicenseInfo expone la instantánea amigable para la visualización en paneles de administración: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, las banderas Has*, los campos de licencia temporal y RejectionMessage.

Exposición de banderas de característica a través de la API

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,
}));

Verificación de salud

AddDoconut() registra una verificación de salud "doconut" que informa el estado de licencia/expiración a través del mecanismo estándar de ASP.NET Core:

csharp
app.MapHealthChecks("/health");

Integrela en su monitoreo y una suscripción que está expirando se convierte en una alerta en lugar de un ticket de soporte.

Actualizaciones de versión

Una licencia cubre una ventana de versión. Actualizar el paquete NuGet a una compilación más reciente que esa ventana invalida la licencia para esa compilación: IsVersionValid pasa a false y la apertura se bloquea con una LicenseException (la razón está en License.RejectionMessage) — falla rápidamente a propósito, de modo que una compilación obsoleta o sin licencia se detecta en el despliegue en lugar de marcar silenciosamente la salida de producción. Renueve la suscripción, reemplace el .lic y reinicie la aplicación para que AddDoconut() cargue la nueva licencia.

¿Fue útil esta página?