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
| Stato | Apre documenti? | Filigrana | Funzionalità |
|---|---|---|---|
| Licenza completa (a pagamento) (all'interno della sua finestra di abbonamento/aggiornamento) | Sì | Nessuna | Quelle acquistate (Has* flags) |
| Licenza temporanea (Developer/NFR — la licenza di valutazione, prima della data di scadenza) | Sì | Nessuna | Tutte — 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 valutazione | Nessuna concessa |
| Nessun file di licenza | Sì | Filigrana di valutazione | Nessuna 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 (daOpenDocumentAsync) contiene il motivo daLicense.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:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionIl singolo filtro che utilizza l'intera pipeline è IsCapabilityGranted:
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:
| Membro | Significato |
|---|---|
IsTemporary | È presente un tag ExpiryNote (il rilevamento avviene tramite la presenza del tag — non confrontare mai il testo della nota, è dinamico) |
ExpiryNote | Testo informativo incorporato nella licenza |
LicenseExpiry | La 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):
| Membro | Significato |
|---|---|
License | Istantanea completa di DoconutLicenseInfo (sotto) |
IsTrial | Un file legacy di tipo TRIAL (trattato come non licenziato — non è un diritto) |
IsTemporary / ExpiryNote / LicenseExpiry | Indicatori di licenza temporanea |
IsExpired | Scaduta secondo le regole di livello sopra |
IsVersionValid | Questa build rientra nella finestra di supporto della licenza |
IsViewerLicensed | File non-TRIAL trovato e versione coperta — prerequisito di base |
IsCapabilityGranted(cap) | Il singolo filtro di funzionalità |
HasSearch HasAnnotation HasConverter HasDicom | Flag di acquisto per funzionalità rilasciati — usa IsCapabilityGranted per la risposta consapevole della temporaneità |
IsValidForDomain(host) | Copertura host; le licenze V4 usano il wildcard *.* |
LicenseRejectionReason | Non 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.
// 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:
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?