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
| 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 — 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 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 (daOpenDocumentAsync) contiene il motivo daLicense.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:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionL'unico controllo che utilizza l'intera pipeline è IsCapabilityGranted:
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:
| Membro | Significato |
|---|---|
IsTemporary | È presente un tag ExpiryNote (il rilevamento avviene per presenza del tag — non si confronta 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 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):
| 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) | L'unico controllo 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 visualizzabile per i pannelli admin: 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 salute
AddDoconut() registra un controllo di salute "doconut" che segnala lo stato della licenza/scadenza tramite il meccanismo standard di ASP.NET Core:
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?