Configurazione della licenza
Dove Doconut cerca il tuo file di licenza
Senza una licenza, Doconut continua a renderizzare i documenti — ogni pagina mostra semplicemente una filigrana di valutazione. Questa pagina descrive i quattro modi per fornire una licenza e la precedenza esatta quando ne è impostata più di una.
Quattro modi per fornire una licenza
Ci sono quattro: tre fonti esplicite su DoconutOptions — un flusso, contenuto grezzo o un percorso file — più la scoperta automatica quando nessuna di esse è impostata. Quando ne è impostata più di una, la precedenza è precisa:
LicenseStream precede LicenseContent precede LicensePath precede auto-search.
Per percorso
LicensePath viene passato a File.Exists esattamente così com'è. Un percorso relativo viene risolto rispetto alla directory di lavoro corrente del processo — non alla cartella del tuo progetto, e non alla cartella in cui vive Program.cs. Se il percorso non si risolve, Doconut non genera eccezioni e non ricade nella ricerca automatica — semplicemente non carica alcuna licenza e il visualizzatore aggiunge la filigrana. La ricerca automatica viene eseguita solo quando nessuno di LicensePath, LicenseContent o LicenseStream è impostato. I file di licenza per plugin nella stessa cartella (Doconut.Viewer.<Capability>.lic) vengono letti con essa, quindi LicensePath e AddPlugin<...>() funzionano insieme quando le licenze dei plugin si trovano accanto alla licenza di base.
Preferisci un percorso assoluto (ad esempio costruito da IWebHostEnvironment.WebRootPath o AppContext.BaseDirectory), oppure ometti completamente LicensePath e fai affidamento sulla scoperta automatica descritta di seguito.
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
});Per flusso
LicenseStream viene letto una sola volta all'avvio — utile quando la licenza proviene da un archivio segreto anziché da un file su disco.
// Priorità: LicenseStream > LicenseContent > LicensePath > ricerca automatica.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});Per contenuto
LicenseContent accetta il testo della licenza stesso — da una variabile d'ambiente, un database o un gestore di segreti:
// XML della licenza da un database, variabile d'ambiente o gestore di segreti —
// nessun file su disco. Superato solo da LicenseStream.
builder.Services.AddDoconut(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});Scoperta automatica
Non configurare nessuna delle tre fonti esplicite, e Doconut cercherà la licenza autonomamente:
// Non configurare nulla, e Doconut cerca la licenza da solo, solo in queste due cartelle:
// 1. {CurrentDirectory}/wwwroot
// 2. {AppContext.BaseDirectory}/wwwroot (wwwroot all'interno della cartella di output della build)
// Cerca prima Doconut.lic, poi Doconut.Viewer.lic, più eventuali per-plugin
// File Doconut.Viewer.<Capability>.lic accanto ad esso.
builder.Services.AddDoconut();Le cartelle di ricerca, in ordine, e i nomi file cercati in ciascuna:
1. {CurrentDirectory}/wwwroot
2. {AppContext.BaseDirectory}/wwwroot
Filenames (checked in each folder above, in order):
Doconut.lic — base viewer license (checked first)
Doconut.Viewer.lic — base viewer license
Doconut.Viewer.<Capability>.lic — per-plugin license, alongside the base licenseNiente al di fuori di una cartella wwwroot viene letto: un .lic nella cartella di output stessa, o in wwwroot/lib, viene ignorato.
Copia la licenza nella tua cartella di output
Quando il processo non viene eseguito dalla cartella del progetto — un'app pubblicata, IIS, un container, un runner di test — il primo sondaggio fallisce, e il secondo, {AppContext.BaseDirectory}/wwwroot, deve trovare il file. L'app di test dell'SDK copia le licenze lì ad ogni build con questo target MSBuild:
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
<StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
</ItemGroup>
<!-- Elimina prima, così rinominare o rimuovere un .lic in wwwroot lo rimuove anche dall'output. -->
<Delete Files="@(StaleOutputLicenses)" />
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>La destinazione deve essere $(OutDir)wwwroot: un .lic copiato nella radice dell'output non viene mai trovato dalla ricerca automatica. Gli esempi LicensePath su questa pagina puntano allo stesso luogo.
Mantieni i file
.licfuori dal controllo di versione — distribuiscili accanto all'app, o inietta la licenza tramiteLicenseContentoLicenseStreamdal tuo archivio segreto.
Cosa succede senza una licenza
Una licenza mancante non genera eccezione. AddDoconut() ha successo, l'app si avvia e il visualizzatore funziona — ma ogni pagina presenta una filigrana di valutazione e nessuna capacità opzionale è concessa.
Un file di licenza trovato ma rifiutato è diverso. Una firma non valida, manomissione, inserimento in lista nera o una build al di fuori della finestra di versione della licenza provoca OpenDocumentAsync a lanciare LicenseException con License.RejectionMessage. Una licenza scaduta per calendario che non ha messaggio di rifiuto continua in modalità con filigrana.
I plugin richiedono capacità
Registrare un plugin senza il relativo diritto è diverso: per una licenza mancante, un file legacy TRIAL, o una licenza a pagamento senza quella capacità, AddDoconut() lancia InvalidOperationException, quindi l'app non si avvia. Per esempio, registrare il plugin Converter senza una licenza che conceda Converter:
InvalidOperationException: The Converter plugin is registered via AddPlugin but no active
license grants Converter. Remove the AddPlugin<...>() call or install a license (or
trial/demo) that includes Converter.Il messaggio indica direttamente la correzione: rimuovere la chiamata options.AddPlugin<...>() per quel plugin, oppure installare una licenza a pagamento o una licenza Temporanea/Demo (NFR) attiva che conceda la capacità. Le registrazioni temporanee possono sopravvivere alla data di scadenza in modo che un'app già configurata possa degradare a runtime invece di andare in crash durante il riavvio; una volta scadute, le loro capacità sono comunque revocate.
Verifica la licenza caricata
Usa IDoconutLicenseService, la stessa fonte di verità usata dall'SDK, per esporre un endpoint diagnostico autenticato o per gestire i flag delle funzionalità. Non restituire il contenuto della licenza o le chiavi.
app.MapGet("/api/doconut/license", (IDoconutLicenseService license) => Results.Ok(new
{
viewer = license.IsViewerLicensed || license.IsTemporary,
temporary = license.IsTemporary,
search = license.IsCapabilityGranted(LicenseCapability.Search),
annotation = license.IsCapabilityGranted(LicenseCapability.Annotation),
converter = license.HasConverter,
dicom = license.HasDicom
}));La licenza viene letta durante la registrazione AddDoconut(). ResetLicense è attualmente una proprietà di compatibilità senza un percorso di ricarica attivo, quindi sostituire un file di licenza richiede il riavvio dell'applicazione.
Matrice di risoluzione dei problemi
| Sintomo | Causa probabile | Verifica |
|---|---|---|
| Il visualizzatore funziona ma ogni pagina è contrassegnata da filigrana | Nessuna licenza è stata caricata, o la licenza è scaduta per calendario | Risolvi IDoconutLicenseService; verifica la directory di output e la directory di lavoro del processo |
AddDoconut() genera eccezione per un plugin | La licenza non concede quella capacità del plugin | Controlla IsCapabilityGranted(...) e rimuovi le registrazioni che non hai acquistato |
| Un percorso relativo configurato funziona localmente ma non in IIS/container | La directory di lavoro del processo è cambiata | Usa AppContext.BaseDirectory o un percorso assoluto |
Il file .lic sostituito non ha effetto | Il servizio di licenza singleton era già stato creato | Riavvia l'applicazione |
OpenDocumentAsync genera LicenseException | Firma, dominio, finestra di versione, blacklist o gate di runtime del plugin hanno rifiutato la licenza | Leggi il messaggio di eccezione/rifiuto senza esporlo a client non attendibili |
Prossimi passi
- Licenze — capacità, livelli di licenza e verifica di ciò che è stato caricato a runtime.
- Risoluzione dei problemi — filigrane, licenze rifiutate e errori di capacità.
Questa pagina è stata utile?