Licence
Fonctionnalités, niveaux de licence et le service de licence
Cette page est la référence d'exécution sur la façon dont une licence influence le comportement de Doconut : ce que chaque état de licence autorise, comment les capacités sont accordées, et comment tout inspecter depuis le code. (Pour charger une licence, voir Configuration de la licence.)
États de licence et leurs fonctions
| État | Ouvre des documents ? | Filigrane | Capacités |
|---|---|---|---|
| Licence complète (payée) (dans sa fenêtre d'abonnement/mise à jour) | Oui | Aucun | Celles achetées (Has* flags) |
| Licence temporaire (Développeur/NFR — la licence d'évaluation, avant sa date d'expiration) | Oui | Aucun | Toutes — attribution globale (l'entonnoir d'évaluation) |
| Expirée (une licence temporaire après sa date d'expiration, ou un abonnement payé après sa date de renouvellement) | Oui | Filigrane d'évaluation | Aucune accordée |
| Aucun fichier de licence | Oui | Filigrane d'évaluation | Aucune accordée |
| Trouvée mais rejetée (signature invalide, altérée, sur liste noire, ou une version plus récente que la fenêtre de version de la licence) | Non — LicenseException à chaque ouverture | — | — |
Deux conséquences à retenir :
- Une licence manquante n'est pas une licence temporaire. Sans fichier de licence, les pages s'affichent avec un filigrane et aucune capacité (recherche, annotation, plugins) n'est active. L'expérience complète, sans filigrane, nécessite une véritable Licence temporaire (obtenez‑en une).
- Seule une licence rejetée bloque l'ouverture. L'expiration du calendrier/abonnement se traduit par un rendu filigrané ; mais déployer une version plus récente que la fenêtre de version de la licence est rejeté et échoue rapidement avec une
LicenseException, vous le détectez donc au déploiement — et non en diffusant silencieusement une sortie filigranée. Cette exception (provenant deOpenDocumentAsync) contient la raison provenant deLicense.RejectionMessage.
Capacités
Doconut contrôle les fonctionnalités optionnelles par capacité. Aujourd'hui, il s'agit des plugins Converter et DICOM en option ainsi que des fonctionnalités intégrées Search et Annotation, chacune accordée par votre licence. Le visualiseur de base n'est pas une capacité — c'est le prérequis, exposé sous la forme IsViewerLicensed :
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionLe seul point de contrôle utilisé par l'ensemble du pipeline est IsCapabilityGranted :
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);Sa logique, reproduite mot pour mot depuis l'implémentation : une licence Temporaire active (non expirée) accorde toutes les capacités — y compris celles qui ne possèdent pas encore de drapeau d'achat dédié ; une licence réellement achetée accorde exactement ses drapeaux Has* et applique un refus par défaut pour tout ce qui n'est pas mappé. (Un fichier de type TRIAL hérité n'est pas un droit — il est traité comme non licencié : filigrané, aucune capacité accordée.)
Licences temporaires
Les licences temporaires (Développeur/NFR) sont marquées par une balise ExpiryNote et possèdent une date d'expiration stricte :
| Membre | Signification |
|---|---|
IsTemporary | Une balise ExpiryNote est présente (la détection se fait par présence de la balise — ne jamais comparer le texte de la note, il est dynamique) |
ExpiryNote | Texte informatif intégré dans la licence |
LicenseExpiry | La date d'expiration stricte (DateTime?) |
La sémantique d'expiration varie selon le niveau : une licence temporaire expire à la seule date de son LicenseExpiry (sa fenêtre d'abonnement est ignorée ; une licence temporaire sans date est considérée comme expirée, par sécurité). Toutes les autres licences expirent à la date de leur fenêtre d'abonnement/mise à jour.
Référence IDoconutLicenseService
Résolvez IDoconutLicenseService (espace de noms Doconut.Core.Interfaces) depuis DoconutHost.Services. C'est un singleton — la licence est analysée une fois, dans DoconutHost.Initialize :
| Membre | Signification |
|---|---|
License | Instantané complet de DoconutLicenseInfo (ci‑dessous) |
IsTrial | Un fichier de type TRIAL hérité (traité comme non licencié — pas un droit) |
IsTemporary / ExpiryNote / LicenseExpiry | Indicateurs de licence temporaire |
IsExpired | Expirée selon les règles de niveau ci‑dessus |
IsVersionValid | Cette version se situe dans la fenêtre de support de la licence |
IsViewerLicensed | Fichier non-TRIAL trouvé et version couverte — prérequis de base |
IsCapabilityGranted(cap) | Le point de contrôle unique de capacité |
HasSearch HasAnnotation HasConverter HasDicom | Drapeaux d'achat par capacité — utilisez IsCapabilityGranted pour la réponse tenant compte des temporaires |
IsValidForDomain(host) | Couverture d'hôte ; les licences V4 utilisent le caractère générique *.* |
LicenseRejectionReason | Non vide ⇒ l'ouverture est bloquée avec ce message |
DoconutLicenseInfo expose un instantané convivial pour les panneaux d'administration : Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, les drapeaux Has*, les champs de licence temporaire, et RejectionMessage.
Exemple d'endpoint retournant les fonctionnalités disponibles :
// GET /Features - feature-flag your UI from the same source of truth the SDK uses
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);
}Vérification de santé
Doconut enregistre une vérification de santé "doconut" qui rapporte l'état de la licence. Classic ASP.NET n'a pas de point de terminaison santé propre, donc exposez‑la depuis un contrôleur :
Exemple d'endpoint de santé :
// GET /Health - Doconut registers a "doconut" health check that reports the license state:
// Healthy (valid), Degraded (trial or no license file), Unhealthy (expired).
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");
}Intégrez‑le à votre supervision et un abonnement qui expire devient une alerte plutôt qu'un ticket de support. Voir DoconutHost pour les valeurs d'état.
Mises à jour de version
Une licence couvre une fenêtre de version. Mettre à jour le paquet NuGet vers une version plus récente que cette fenêtre rend la licence invalide pour cette version : IsVersionValid devient false et l'ouverture est bloquée avec une LicenseException (la raison se trouve dans License.RejectionMessage) — un échec rapide délibéré, afin qu'une version obsolète ou non licenciée soit détectée au déploiement plutôt que d'appliquer silencieusement un filigrane à la production. Renouvelez l'abonnement, remplacez le fichier .lic dans wwwroot, et recyclez le pool d'applications afin que DoconutHost.Initialize charge la nouvelle licence.
Cette page était-elle utile ?