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.
La licence est chargée une fois, pendant AddDoconut(). C’est un changement par rapport à la bibliothèque .NET Standard précédente, où la licence était transmise à une instance Viewer ou définie via les appels statiques Viewer.DoconutLicense(...) / Viewer.SetLicensePlugin(...). Ces méthodes ne constituent pas un mécanisme de démarrage dans cette version — voir le guide de migration.
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 n'est définie. Lorsque plusieurs sont définies, la priorité est précise :
LicenseStream précède LicenseContent précède LicensePath précède 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 celui 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 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 elle, de sorte que LicensePath et AddPlugin<...>() fonctionnent ensemble lorsque les licences des plugins se trouvent à côté de la licence de base.
Privilégiez un chemin absolu (par exemple construit à partir de IWebHostEnvironment.WebRootPath ou AppContext.BaseDirectory), ou omettez complètement LicensePath et reposez-vous 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 le 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. Supplanté 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 dans le dossier de sortie de la construction)
// Il recherche d'abord Doconut.lic, puis Doconut.Viewer.lic, ainsi que tout fichier de licence par capacité
// Doconut.Viewer.<Capability>.lic situé à 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-capability license, alongside the base licenseRien en dehors d'un dossier wwwroot n'est lu : un fichier .lic dans le dossier de sortie lui‑même, ou dans wwwroot/lib, est ignoré.
Si vous avez précédemment passé une List<string> de chemins de licence au constructeur Viewer — un par capacité — conservez ces fichiers compagnons à côté de Doconut.Viewer.lic et laissez la découverte automatique les récupérer. Il n'existe aucune option de liste de chemins sur DoconutOptions.
Copier 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 — la première recherche échoue, et la seconde, {AppContext.BaseDirectory}/wwwroot, doit trouver le fichier. L'application de test du SDK copie les licences à cet emplacement à chaque compilation avec cette cible MSBuild :
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
<ItemGroup>
<DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
<StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
</ItemGroup>
<!-- Supprimer d'abord, afin que le renommage ou la suppression d'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 de LicensePath sur cette page pointent vers le même endroit.
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 construction hors de la fenêtre de version de la licence provoquent le lancement d’une LicenseException par OpenDocumentAsync avec License.RejectionMessage. Une licence expirée selon le calendrier qui n’a pas de message de rejet continue en mode filigrané.
Les plugins nécessitent des capacités
Enregistrer un plugin sans l'autorisation correspondante 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 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 tout de même révoquées.
Vérifier la licence chargée
Utilisez IDoconutLicenseService, la même source de vérité que le SDK, pour exposer un point de terminaison de diagnostic authentifié ou piloter des 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, de sorte que remplacer un fichier de licence nécessite de redémarrer l’application.
Tableau 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 selon le 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 ne concède 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 unique était déjà 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/rejet sans l'exposer aux clients non fiables |
| Une licence par capacité fonctionnait auparavant mais plus maintenant | L'ancien code passait des chemins de licence explicites au constructeur Viewer | Déplacer les fichiers .lic associés à côté de Doconut.Viewer.lic et laisser la découverte automatique les charger |
Prochaines étapes
Cette page était-elle utile ?