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
| 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 (Sviluppatore/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 rifiutata e fallisce rapidamente con una
LicenseException, così la si intercetta 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; // licenza non-TRIAL presente E che copre la versione di questa buildL'unica porta che l'intera pipeline utilizza è IsCapabilityGranted:
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:
| Membro | Significato |
|---|---|
IsTemporary | Un tag ExpiryNote è presente (il rilevamento avviene per presenza del tag — non si confronta il testo della nota, è dinamico) |
ExpiryNote | Testo informativo incorporato nella licenza |
LicenseExpiry | La 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:
| 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'unica porta di funzionalità |
HasSearch HasAnnotation HasConverter HasDicom | Flag di acquisto rilasciati per funzionalità — usa IsCapabilityGranted per la risposta consapevole della temporanea |
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 amministrativi: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, i flag Has*, i campi della licenza temporanea e RejectionMessage.
// 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:
// 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?