Licenze

Funzionalità, livelli di licenza e il servizio di licenza

Questa pagina è il riferimento a runtime su come una licenza influisce sul comportamento di Doconut: cosa consente ogni stato di licenza, come vengono concesse le funzionalità e come ispezionare tutto dal codice. (Per caricare una licenza, vedere Configurazione della licenza.)

Stati della licenza e cosa fanno

StatoApre documenti?FiligranaFunzionalità
Licenza completa (a pagamento) (all'interno della sua finestra di abbonamento/aggiornamento)SìNessunaQuelle acquistate (Has* flags)
Licenza temporanea (Sviluppatore/NFR — la licenza di valutazione, prima della data di scadenza)SìNessunaTutte — concessione totale (il funnel di valutazione)
Scaduta (una licenza temporanea oltre la data di scadenza, o un abbonamento a pagamento oltre la data di rinnovo)SìFiligrana di valutazioneNessuna concessa
Nessun file di licenzaSìFiligrana di valutazioneNessuna concessa
Trovata ma rifiutata (firma non valida, manomessa, in lista nera, o una build più recente della finestra di versione della licenza)No — LicenseException su ogni apertura——

Due conseguenze da tenere a mente:

  • Una licenza mancante non è una licenza temporanea. Senza file di licenza, le pagine vengono visualizzate con filigrana e nessuna funzionalità (ricerca, annotazione, plugin) è attiva. L'esperienza completa, senza filigrana, richiede una vera Licenza temporanea (ottieni una).
  • Solo una licenza rifiutata blocca l'apertura. La scadenza del calendario/abbonamento degrada la visualizzazione a filigrana; ma distribuire una build più recente della finestra di versione della licenza viene rifiutata e fallisce rapidamente con una LicenseException, così la si intercetta al deploy — non inviando silenziosamente output con filigrana. Quell'eccezione (da OpenDocumentAsync) contiene il motivo da License.RejectionMessage.

Funzionalità

Doconut controlla le funzionalità opzionali tramite funzionalità. Oggi sono i plugin opzionali Converter e DICOM più le funzionalità integrate Search e Annotation, ciascuna concessa dalla tua licenza. Il visualizzatore di base non è una funzionalità — è il prerequisito, esposto come IsViewerLicensed:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // licenza non-TRIAL presente E che copre la versione di questa build

L'unica porta che l'intera pipeline utilizza è IsCapabilityGranted:

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

La sua logica, riportata alla lettera dall'implementazione: una licenza temporanea attiva (non scaduta) concede tutte le funzionalità — incluse quelle che non hanno ancora un flag di acquisto dedicato; una licenza reale acquistata concede esattamente i suoi flag Has* ed è default-deny per qualsiasi cosa non mappata. (Un file legacy di tipo TRIAL non è un diritto — è trattato come non licenziato: con filigrana, nessuna concessione.)

Licenze temporanee

Le licenze temporanee (Sviluppatore/NFR) sono contrassegnate da un tag ExpiryNote e hanno una data di scadenza rigida:

MembroSignificato
IsTemporaryUn tag ExpiryNote è presente (il rilevamento avviene per presenza del tag — non si confronta il testo della nota, è dinamico)
ExpiryNoteTesto informativo incorporato nella licenza
LicenseExpiryLa data di scadenza rigida (DateTime?)

Le semantiche di scadenza differiscono per livello: una licenza temporanea scade solo alla sua data LicenseExpiry (la sua finestra di abbonamento è ignorata; una licenza temporanea priva della data è trattata come scaduta, in modalità fail-safe). Tutte le altre licenze scadono alla data della loro finestra di abbonamento/aggiornamento.

Riferimento IDoconutLicenseService

Risolvi IDoconutLicenseService (namespace Doconut.Core.Interfaces) da DoconutHost.Services. È un singleton — la licenza viene analizzata una sola volta, in DoconutHost.Initialize:

MembroSignificato
LicenseIstantanea completa di DoconutLicenseInfo (sotto)
IsTrialUn file legacy di tipo TRIAL (trattato come non licenziato — non un diritto)
IsTemporary / ExpiryNote / LicenseExpiryIndicatori di licenza temporanea
IsExpiredScaduta secondo le regole di livello sopra
IsVersionValidQuesta build rientra nella finestra di supporto della licenza
IsViewerLicensedFile non-TRIAL trovato e versione coperta — prerequisito di base
IsCapabilityGranted(cap)L'unica porta di funzionalità
HasSearch HasAnnotation HasConverter HasDicomFlag di acquisto rilasciati per funzionalità — usa IsCapabilityGranted per la risposta consapevole della temporanea
IsValidForDomain(host)Copertura host; le licenze V4 usano il wildcard *.*
LicenseRejectionReasonNon vuoto ⇒ l'apertura è bloccata con questo messaggio

DoconutLicenseInfo espone l'istantanea visualizzabile per i pannelli amministrativi: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, i flag Has*, i campi della licenza temporanea e RejectionMessage.

csharp
// GET /Features - abilita le funzionalità della tua UI dalla stessa fonte di verità usata dall'SDK
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);
}

Controllo di integrità

Doconut registra un controllo di integrità "doconut" che riporta lo stato della licenza. Classic ASP.NET non dispone di un endpoint di integrità proprio, quindi esponilo da un controller:

csharp
// GET /Health - Doconut registra un controllo di integrità "doconut" che riporta lo stato della licenza:
// Healthy (valida), Degraded (trial o nessun file di licenza), Unhealthy (scaduta).
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");
}

Collegalo al tuo monitoraggio e un abbonamento in scadenza diventa un avviso invece di un ticket di supporto. Vedi DoconutHost per i valori di stato.

Aggiornamenti di versione

Una licenza copre una finestra di versione. Aggiornare il pacchetto NuGet a una build più recente della finestra rende la licenza non valida per questa build: IsVersionValid diventa false e l'apertura è bloccata con una LicenseException (il motivo è in License.RejectionMessage) — fallimento rapido deliberato, così una build obsoleta o non licenziata viene intercettata al deploy invece di aggiungere silenziosamente filigrane all'output di produzione. Rinnova l'abbonamento, sostituisci il file .lic in wwwroot e ricicla il pool di applicazioni affinché DoconutHost.Initialize carichi la nuova licenza.

Questa pagina è stata utile?