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 agua | Capacidades |
|---|---|---|---|
| Licencia completa (de pago) (dentro de su ventana de suscripción/actualización) | Sí | Ninguna | Las compradas (Has* flags) |
| Licencia temporal (Desarrollador/NFR — la licencia de evaluación, antes de su fecha de expiración) | Sí | Ninguna | Todas — 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) | Sí | Marca de agua de evaluación | Ninguna concedida |
| Sin archivo de licencia | Sí | Marca de agua de evaluación | Ninguna 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 (deOpenDocumentAsync) lleva la razón deLicense.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:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionLa única puerta que usa todo el pipeline es IsCapabilityGranted:
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:
| Miembro | Significado |
|---|---|
IsTemporary | Existe 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) |
ExpiryNote | Texto informativo incrustado en la licencia |
LicenseExpiry | La 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):
| Miembro | Significado |
|---|---|
License | Instantánea completa de DoconutLicenseInfo (abajo) |
IsTrial | Un archivo legado de tipo TRIAL (tratado como sin licencia — no es un derecho) |
IsTemporary / ExpiryNote / LicenseExpiry | Marcadores de licencia temporal |
IsExpired | Expirada según las reglas de nivel anteriores |
IsVersionValid | Esta compilación está dentro de la ventana de soporte de la licencia |
IsViewerLicensed | Archivo no TRIAL encontrado y versión cubierta — requisito base |
IsCapabilityGranted(cap) | La única puerta de capacidad |
HasSearch HasAnnotation HasConverter HasDicom | Bandera de compra por capacidad — use IsCapabilityGranted para la respuesta consciente de temporales |
IsValidForDomain(host) | Cobertura de host; licencias V4 usan el comodín *.* |
LicenseRejectionReason | No 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
// 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:
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?