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, consulte 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 compradas (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 nueva 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 nueva que la ventana de versión de la licencia es rechazado y falla rápidamente con una LicenseException, de modo que lo capturas 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 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; // 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 tipo TRIAL no es un derecho — se trata como sin licencia: con marca de agua, nada concedido.)

Licencias temporales

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 solo en su fecha LicenseExpiry (se ignora su ventana de suscripción; una licencia temporal sin fecha se trata como expirada, por seguridad). Todas las demás licencias expiran en su fecha de ventana de suscripción/actualización.

Referencia de IDoconutLicenseService

Resuelva IDoconutLicenseService (espacio de nombres Doconut.Core.Interfaces) desde DoconutHost.Services. Es un singleton — la licencia se analiza una vez, en DoconutHost.Initialize:

MiembroSignificado
LicenseInstantánea completa de DoconutLicenseInfo (abajo)
IsTrialUn archivo legado 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 — 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 paneles de administración: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, las banderas Has*, los campos de licencia temporal y 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);
}

Chequeo de salud

Doconut registra una comprobación de salud "doconut" que informa del estado de la licencia. Classic ASP.NET no tiene su propio endpoint de salud, así que expóngalo desde un controlador:

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

Conéctelo a su monitoreo y una suscripción que expira se convierte en una alerta en lugar de un ticket de soporte. Consulte DoconutHost para los valores de estado.

Actualizaciones de versión

Una licencia cubre una ventana de versión. Actualizar el paquete NuGet a una compilación más nueva que esa ventana invalida la licencia para esta 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 en wwwroot y recicle el pool de aplicaciones para que DoconutHost.Initialize cargue la nueva licencia.

¿Fue útil esta página?