Configuration de 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 manières de fournir une licence, ainsi que la priorité exacte lorsqu'il y en a plusieurs définies.
Quatre manières 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ù vit 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 charge simplement aucune licence et le visualiseur ajoute un filigrane. La recherche automatique ne s'exécute que lorsqu'aucun de LicensePath, LicenseContent ou LicenseStream n'est défini. Les fichiers de licence par plugin dans le même dossier (Doconut.Viewer.<Capability>.lic) sont lus avec celle‑ci, de sorte que LicensePath et AddPlugin<...>() fonctionnent ensemble lorsque les licences des plugins se trouvent à côté de la licence principale.
Privilégiez un chemin absolu (par exemple construit à partir de IWebHostEnvironment.WebRootPath ou AppContext.BaseDirectory), ou ignorez complètement LicensePath et comptez sur la découverte automatique ci‑dessous.
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "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 disque.
// Priorité : LicenseStream > LicenseContent > LicensePath > recherche automatique.
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 :
// XML de licence provenant d'une base de données, d'une variable d'environnement ou d'un gestionnaire de secrets —
// pas de fichier sur le disque. Surclassé uniquement par 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 :
// Ne configurez rien, et Doconut recherche la licence lui‑même, uniquement dans ces deux dossiers :
// 1. {CurrentDirectory}/wwwroot
// 2. {AppContext.BaseDirectory}/wwwroot (wwwroot à l'intérieur du dossier de sortie de la compilation)
// Il recherche d'abord Doconut.lic, puis Doconut.Viewer.lic, ainsi que tout fichier spécifique à un plugin
// les fichiers Doconut.Viewer.<Capability>.lic à côté.
builder.Services.AddDoconut();Les dossiers de recherche, dans l'ordre, et les noms de fichiers recherchés dans chacun :
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 licenseRien en dehors d'un dossier wwwroot n'est lu : un .lic dans le dossier de sortie lui‑même, ou dans wwwroot/lib, est ignoré.
Copiez la licence dans votre dossier de sortie
Lorsque le processus ne s'exécute pas depuis le dossier du projet — une application publiée, IIS, un conteneur, un exécuteur de tests — le premier sondage échoue, et le second, {AppContext.BaseDirectory}/wwwroot, doit trouver le fichier. L'application de test du SDK copie les licences à cet endroit à chaque compilation avec cette cible MSBuild :
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
<StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
</ItemGroup>
<!-- Supprimez d'abord, afin que renommer ou supprimer un .lic dans wwwroot le retire également de la sortie. -->
<Delete Files="@(StaleOutputLicenses)" />
<Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>La destination doit être $(OutDir)wwwroot : un .lic copié à la racine de la sortie n'est jamais trouvé par la recherche automatique. Les exemples LicensePath de cette page pointent vers le même emplacement.
Gardez les fichiers
.lichors du contrôle de version — déployez‑les à côté de l'application, ou injectez la licence viaLicenseContentouLicenseStreamdepuis votre magasin de secrets.
Que se passe-t-il 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 version hors de la fenêtre de version de la licence provoque le lancement de OpenDocumentAsync qui lève LicenseException 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 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 InvalidOperationException, de sorte que l'application ne démarre pas. Par exemple, enregistrer le plugin Converter sans une licence qui accorde 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 vous 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 les drapeaux de fonctionnalités. Ne renvoyez pas le contenu de la licence ni les clés.
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é au plugin | Vérifiez IsCapabilityGranted(...) et supprimez les enregistrements que vous n'avez pas achetés |
| Un chemin relatif configuré fonctionne localement mais pas dans IIS/conteneur | Le répertoire de travail du processus a changé | Utilisez AppContext.BaseDirectory ou un chemin absolu |
Le fichier .lic remplacé n'a aucun effet | Le service de licence singleton était déjà créé | Redémarrez 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 | Lisez le message d'exception/de rejet sans l'exposer aux clients non fiables |
Prochaines étapes
Cette page était-elle utile ?