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 inspeccionarlo todo desde el código. (Para cargar una licencia, vea Comenzando → 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 que se compraron (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 faltante 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 un
LicenseException, de modo que lo detectas en el despliegue — no enviando silenciosamente una 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 optativos 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; // licencia non-TRIAL presente Y cubriendo la versión de esta compilaciónLa ú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 tiene 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) están marcadas con una etiqueta ExpiryNote y poseen una fecha de expiración estricta:
| Miembro | Significado |
|---|---|
IsTemporary | Una etiqueta ExpiryNote está presente (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 estricta (DateTime?) |
La semántica de expiración difiere por nivel: una licencia temporal expira en su LicenseExpiry solo fecha (se ignora su ventana de suscripción; una licencia temporal sin la fecha se trata como expirada, a prueba de fallos). Todas las demás licencias expiran en la fecha de su 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 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 | Banderas de compra por capacidad liberadas — 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 se bloquea con este mensaje |
DoconutLicenseInfo expone la instantánea amigable para 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.
// Feature-flag tu UI desde la misma fuente de verdad que usa el SDK
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");Integre esto en su monitoreo y una suscripción que está por expirar 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 convierte false y la apertura se bloquea con un 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 al desplegar 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?