Configuration de la licence
Où Doconut recherche votre fichier de licence
Sans licence, Doconut rend toujours les documents — chaque page porte simplement un filigrane d'évaluation. Cette page décrit les quatre façons de fournir une licence, ainsi que la priorité exacte lorsqu'il y en a plusieurs définies.
Quatre façons de fournir une licence
Il y en a quatre : trois sources explicites sur DoconutOptions — un flux, du contenu brut ou un chemin de fichier — plus la découverte automatique lorsqu'aucune d'elles n'est définie. Lorsque plusieurs sont définies, la priorité est précise :
LicenseStream l'emporte sur LicenseContent l'emporte sur LicensePath l'emporte sur la recherche automatique.
Par chemin
LicensePath est transmis à File.Exists exactement tel quel. Un chemin relatif est résolu par rapport au répertoire de travail actuel du processus — pas le dossier de votre projet, et pas le dossier où se trouve Program.cs. Si le chemin ne se résout pas, Doconut ne lève pas d'exception et ne revient pas à la recherche automatique — il ne charge simplement aucune licence et le visualiseur applique un filigrane. La recherche automatique ne s'exécute que lorsqu'aucun de LicensePath, LicenseContent ou LicenseStream n'est défini.
Privilégiez un chemin absolu (par exemple construit à partir de IWebHostEnvironment.WebRootPath ou AppContext.BaseDirectory), ou omettez complètement LicensePath et comptez sur la découverte automatique ci‑dessous.
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "Doconut.Viewer.lic");
});Par flux
LicenseStream est lu une fois au démarrage — utile lorsque la licence provient d'un magasin secret plutôt que d'un fichier sur le disque.
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
builder.Services.AddDoconut(options =>
{
options.LicenseStream = licenseStream;
});Par contenu
LicenseContent accepte le texte de la licence lui‑même — provenant d'une variable d'environnement, d'une base de données ou d'un gestionnaire de secrets :
// License XML from a database, environment variable, or secret manager —
// no file on disk. Beaten only by LicenseStream.
builder.Services.AddDoconut(options =>
{
options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});Découverte automatique
Ne configurez aucune des trois sources explicites, et Doconut recherche la licence lui‑même :
// Configure nothing, and Doconut searches for the license itself:
// 1. {CurrentDirectory}/wwwroot
// 2. {CurrentDirectory}/wwwroot/lib
// 3. AppContext.BaseDirectory (the build output folder)
// It looks for Doconut.Viewer.lic plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
builder.Services.AddDoconut();Les répertoires sondés, dans l'ordre, ainsi que les noms de fichiers recherchés dans chacun :
1. {CurrentDirectory}/wwwroot
2. {CurrentDirectory}/wwwroot/lib
3. AppContext.BaseDirectory
Filenames (checked in each directory above, in order):
Doconut.Viewer.lic — base viewer license
Doconut.Viewer.<Capability>.lic — per-plugin license, alongside Doconut.Viewer.licCopier la licence dans votre dossier de sortie
LicensePath, ainsi que le sondage AppContext.BaseDirectory de la recherche automatique, nécessitent tous deux que le fichier .lic existe à côté de l'application compilée — pas seulement dans votre wwwroot source. L'application de test du SDK le copie à chaque compilation avec cette cible MSBuild :
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
</ItemGroup>
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>Gardez les fichiers
.lichors du contrôle de version — déployez‑les à côté de l'application, ou injectez la licence viaLicenseContentouLicenseStreamdepuis votre magasin secret.
Ce qui se passe sans licence
Une licence manquante ne génère pas d'exception. AddDoconut() réussit, l'application démarre, et le visualiseur s'exécute — mais chaque page porte un filigrane d'évaluation et aucune capacité optionnelle n'est accordée.
Un fichier de licence trouvé mais rejeté est différent. Une signature invalide, une falsification, une mise sur liste noire, ou une construction en dehors de la fenêtre de version de la licence provoquent le déclenchement d'une LicenseException par OpenDocumentAsync avec License.RejectionMessage. Une licence expirée au niveau du calendrier sans message de rejet continue en mode filigrané.
Les plugins nécessitent des capacités
Enregistrer un plugin sans le droit correspondant est différent : pour une licence manquante, un fichier TRIAL hérité, ou une licence payante ne contenant pas cette capacité, AddDoconut() lève une InvalidOperationException, de sorte que l'application ne démarre pas. Par exemple, enregistrer le plugin Converter sans une licence accordant 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.Le message indique directement la solution : soit supprimer l'appel options.AddPlugin<...>() pour ce plugin, soit installer une licence payante ou une licence temporaire/Démo (NFR) active qui accorde la capacité. Les enregistrements temporaires sont autorisés à survivre à leur date d'expiration afin qu'une application déjà configurée puisse se dégrader à l'exécution plutôt que de planter lors du redémarrage ; une fois expirées, leurs capacités sont toujours révoquées.
Vérifier la licence chargée
Utilisez IDoconutLicenseService, la même source de vérité utilisée par le SDK, pour exposer un point de terminaison de diagnostic authentifié ou pour piloter des drapeaux de fonctionnalité. Ne renvoyez pas le contenu ou les clés de la licence.
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 licence est lue lors de l'enregistrement AddDoconut(). ResetLicense est actuellement une propriété de compatibilité sans chemin de rechargement actif, ainsi le remplacement d'un fichier de licence nécessite de redémarrer l'application.
Matrice de dépannage
| Symptôme | Cause probable | Vérification |
|---|---|---|
| Le visualiseur fonctionne mais chaque page est filigranée | Aucune licence n'a été chargée, ou la licence est expirée au niveau du calendrier | Résoudre IDoconutLicenseService ; vérifier le répertoire de sortie et le répertoire de travail du processus |
AddDoconut() lève une exception pour un plugin | La licence n'accorde pas cette capacité de plugin | Vérifier IsCapabilityGranted(...) et supprimer les enregistrements que vous n'avez pas achetés |
| Un chemin relatif configuré fonctionne localement mais pas sous IIS/conteneur | Le répertoire de travail du processus a changé | Utiliser AppContext.BaseDirectory ou un chemin absolu |
Le fichier .lic remplacé n'a aucun effet | Le service de licence singleton a déjà été créé | Redémarrer l'application |
OpenDocumentAsync lève LicenseException | Signature, domaine, fenêtre de version, liste noire ou porte d'exécution du plugin ont rejeté la licence | Lire le message d'exception/de rejet sans l'exposer aux clients non fiables |
Prochaines étapes
- Gestion des licences — capacités, niveaux de licence et vérification de ce qui a été chargé à l'exécution.
- Dépannage — filigranes, licences rejetées et erreurs de capacité.
Cette page vous a-t-elle été utile ?