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 aguaCapacidades
Licencia completa (de pago) (dentro de su ventana de suscripción/actualización)SíNingunaLas que se compraron (Has* flags)
Licencia temporal (Desarrollador/NFR — la licencia de evaluación, antes de su fecha de expiración)Sí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)SíMarca de agua de evaluaciónNinguna concedida
Sin archivo de licenciaSíMarca 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 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 (de OpenDocumentAsync) lleva la razón de License.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:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // licencia non-TRIAL presente Y cubriendo la versión de esta compilación

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 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:

MiembroSignificado
IsTemporaryUna 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)
ExpiryNoteTexto informativo incrustado en la licencia
LicenseExpiryLa 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):

MiembroSignificado
LicenseInstantánea completa 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 HasDicomBanderas de compra por capacidad liberadas — use IsCapabilityGranted para la respuesta consciente de temporales
IsValidForDomain(host)Cobertura de host; licencias V4 usan el comodín *.*
LicenseRejectionReasonNo 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.

csharp
// 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:

csharp
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?