Licenze

Funzionalità, livelli di licenza e il servizio di licenza

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

Stati della licenza e cosa fanno

StatoApre documenti?FiligranaFunzionalità
Licenza completa (a pagamento) (all'interno della sua finestra di abbonamento/aggiornamento)NessunaQuelle acquistate (Has* flags)
Licenza temporanea (Developer/NFR — la licenza di valutazione, prima della data di scadenza)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)Filigrana di valutazioneNessuna concessa
Nessun file di licenzaFiligrana 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 rifiutato e fallisce rapidamente con una LicenseException, così lo intercetti al deploy — non inviando silenziosamente output con filigrana. Quell'eccezione (da OpenDocumentAsync) contiene il motivo da License.RejectionMessage.

Funzionalità

Doconut controlla la funzionalità opzionale mediante capability. Oggi si tratta dei plugin opzionali Converter e DICOM più le funzionalità integrate Search e Annotation, ciascuna concessa dalla tua licenza. Il visualizzatore di base non è una capability — è il prerequisito, esposto come IsViewerLicensed:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's version

Il singolo filtro che utilizza l'intera pipeline è IsCapabilityGranted:

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

La sua logica, parola per parola dall'implementazione: una licenza Temporary attiva (non scaduta) concede tutte le capability — incluse quelle che non hanno ancora un flag di acquisto dedicato; una licenza acquistata reale concede esattamente i suoi flag Has* ed è default-deny per tutto ciò che non è mappato. (Un file legacy di tipo TRIAL non è un diritto — è trattato come non licenziato: filigrana, nulla concesso.)

Licenze temporanee

La ricerca e l'annotazione normali usano direttamente le loro capability esistenti.

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

MembroSignificato
IsTemporaryÈ presente un tag ExpiryNote (il rilevamento avviene tramite la presenza del tag — non confrontare mai il testo della nota, è dinamico)
ExpiryNoteTesto informativo incorporato nella licenza
LicenseExpiryLa data di scadenza rigida (DateTime?)

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

Riferimento IDoconutLicenseService

Inietta IDoconutLicenseService (namespace Doconut.Core.Interfaces; registrato come singleton — la licenza viene analizzata una sola volta all'avvio):

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)Il singolo filtro di funzionalità
HasSearch HasAnnotation HasConverter HasDicomFlag di acquisto per funzionalità rilasciati — usa IsCapabilityGranted per la risposta consapevole della temporaneità
IsValidForDomain(host)Copertura host; le licenze V4 usano il wildcard *.*
LicenseRejectionReasonNon vuoto ⇒ l'apertura è bloccata con questo messaggio

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

csharp
// 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,
}));

Controllo di integrità

AddDoconut() registra un controllo di salute "doconut" che riporta lo stato di licenza/scadenza tramite il meccanismo standard di ASP.NET Core:

csharp
app.MapHealthChecks("/health");

Collegalo al tuo sistema di monitoraggio e un abbonamento in scadenza diventa un avviso anziché un ticket di supporto.

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 quella 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 una filigrana all'output di produzione. Rinnova l'abbonamento, sostituisci il file .lic e riavvia l'applicazione affinché AddDoconut() carichi la nuova licenza.

Questa pagina è stata utile?