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 Guida introduttiva → Configurazione 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 — 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 ad ogni apertura

Due conseguenze da interiorizzare:

  • 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 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 è 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 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; // non-TRIAL license present AND covering this build's version

L'unico controllo che utilizza l'intera pipeline è IsCapabilityGranted:

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

La sua logica, parola per parola 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 acquistata reale concede esattamente i suoi flag Has* ed è default-deny per qualsiasi cosa non mappata. (Un file legacy di tipo TRIAL non è un diritto — viene trattato come non licenziato: con filigrana, nessuna concessione.)

Licenze temporanee

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

MembroSignificato
IsTemporaryÈ presente un tag ExpiryNote (il rilevamento avviene per presenza del tag — non si confronta 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 alla sola data di 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

Inietta IDoconutLicenseService (namespace Doconut.Core.Interfaces; registrato come singleton — la licenza è analizzata una 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)L'unico controllo 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 visualizzabile per i pannelli admin: 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 salute

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

csharp
app.MapHealthChecks("/health");

Collegalo al tuo monitoraggio e un abbonamento in scadenza diventa un avviso invece di 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 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 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?