Lizenzierung
Funktionen, Lizenzstufen und der Lizenzdienst
Diese Seite ist die Laufzeit‑Referenz dafür, wie eine Lizenz das Verhalten von Doconut beeinflusst: was jeder Lizenzstatus erlaubt, wie Fähigkeiten (Capabilities) gewährt werden und wie man all das aus dem Code heraus inspiziert. (Zum Laden einer Lizenz siehe Lizenz‑Setup.)
Lizenz‑Zustände und ihre Wirkung
| Zustand | Öffnet Dokumente? | Wasserzeichen | Fähigkeiten |
|---|---|---|---|
| Vollständige (bezahlte) Lizenz (innerhalb ihres Abonnement‑/Update‑Fensters) | Ja | Keine | Die erworbenen (Has*‑Flags) |
| Temporäre Lizenz (Entwickler/NFR — die Evaluationslizenz, vor ihrem Ablaufdatum) | Ja | Keine | Alle — Pauschalgewährung (der Evaluations‑Trichter) |
| Abgelaufen (eine temporäre Lizenz nach ihrem Ablaufdatum oder ein bezahltes Abonnement nach seinem Erneuerungsdatum) | Ja | Evaluierungs‑Wasserzeichen | Keine gewährt |
| Keine Lizenzdatei vorhanden | Ja | Evaluierungs‑Wasserzeichen | Keine gewährt |
| Gefunden, aber abgelehnt (ungültige Signatur, manipuliert, gesperrt oder ein Build neuer als das Versionsfenster der Lizenz) | Nein — LicenseException bei jedem Öffnen | — | — |
Zwei Konsequenzen, die man verinnerlichen sollte:
- Eine fehlende Lizenz ist keine temporäre Lizenz. Ohne Lizenzdatei werden Seiten wasserzeichen‑gekennzeichnet dargestellt und keine Fähigkeit (Suche, Annotation, Plugins) ist aktiv. Das voll funktionsfähige, wasserzeichen‑freie Erlebnis erfordert eine echte Temporäre Lizenz (einen erhalten).
- Nur eine abgelehnte Lizenz blockiert das Öffnen. Das Ablauf‑/Abonnement‑Datum führt zu einer wasserzeichen‑gekennzeichneten Darstellung; ein Build neuer als das Versionsfenster der Lizenz wird jedoch abgelehnt und löst sofort eine
LicenseExceptionaus, sodass Sie den Fehler beim Deployment abfangen — nicht durch stilles Ausliefern von wasserzeichen‑gekennzeichneten Ausgaben. Diese Ausnahme (vonOpenDocumentAsync) enthält den Grund ausLicense.RejectionMessage.
Fähigkeiten (Capabilities)
Doconut steuert optionale Funktionalität über Capabilities. Heute sind das die optionalen Converter‑ und DICOM‑Plugins sowie die integrierten Suche‑ und Annotation‑Funktionen, die jeweils durch Ihre Lizenz gewährt werden. Der Basis‑Viewer ist keine Capability — er ist die Voraussetzung, dargestellt als IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionDas einzige Gate, das die gesamte Pipeline verwendet, ist IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);Seine Logik, wortwörtlich aus der Implementierung: Eine aktive (nicht abgelaufene) Temporäre Lizenz gewährt jede Capability — einschließlich solcher, für die noch kein eigenes Kauf‑Flag existiert; eine echte, gekaufte Lizenz gewährt exakt ihre Has*‑Flags und ist standardmäßig verweigernd für alles, was nicht zugeordnet ist. (Eine Legacy‑TRIAL‑Datei ist keine Berechtigung — sie wird als nicht lizenziert behandelt: wasserzeichen‑gekennzeichnet, nichts gewährt.)
Temporäre Lizenzen
Temporäre (Entwickler/NFR) Lizenzen werden durch ein ExpiryNote‑Tag gekennzeichnet und besitzen ein festes Ablaufdatum:
| Mitglied | Bedeutung |
|---|---|
IsTemporary | Ein ExpiryNote‑Tag ist vorhanden (Erkennung erfolgt über das Vorhandensein des Tags — der Text des Hinweises wird nie verglichen, er ist dynamisch) |
ExpiryNote | Informations‑Text, der in der Lizenz eingebettet ist |
LicenseExpiry | Das feste Ablaufdatum (DateTime?) |
Die Ablauf‑Semantik unterscheidet sich je nach Stufe: Eine temporäre Lizenz verfällt ausschließlich an ihrem Datum LicenseExpiry (ihr Abonnement‑Fenster wird ignoriert; eine temporäre Lizenz ohne Datum wird aus Sicherheitsgründen als abgelaufen behandelt). Alle anderen Lizenzen verfallen am Datum ihres Abonnement‑/Update‑Fensters.
Referenz zu IDoconutLicenseService
Lösen Sie IDoconutLicenseService (Namespace Doconut.Core.Interfaces) aus DoconutHost.Services auf. Es ist ein Singleton — die Lizenz wird einmalig geparst, in DoconutHost.Initialize:
| Mitglied | Bedeutung |
|---|---|
License | Vollständiger DoconutLicenseInfo‑Snapshot (siehe unten) |
IsTrial | Eine Legacy‑TRIAL‑Datei (als nicht lizenziert behandelt — keine Berechtigung) |
IsTemporary / ExpiryNote / LicenseExpiry | Marker für temporäre Lizenzen |
IsExpired | Nach den oben genannten Stufenregeln abgelaufen |
IsVersionValid | Dieser Build liegt innerhalb des Lizenz‑Support‑Fensters |
IsViewerLicensed | Nicht‑TRIAL‑Datei gefunden und Version abgedeckt — Basis‑Voraussetzung |
IsCapabilityGranted(cap) | Das einzelne Capability‑Gate |
HasSearch HasAnnotation HasConverter HasDicom | Freigegebene pro‑Capability‑Kauf‑Flags — verwenden Sie IsCapabilityGranted für die temporär‑bewusste Antwort |
IsValidForDomain(host) | Host‑Abdeckung; V4‑Lizenzen nutzen das Platzhalter‑Muster *.* |
LicenseRejectionReason | Nicht‑leer ⇒ Öffnen wird mit dieser Meldung blockiert |
DoconutLicenseInfo stellt den benutzerfreundlichen Snapshot für Admin‑Panels bereit: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, die Has*‑Flags, die Felder für temporäre Lizenzen und RejectionMessage.
// 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);
}Gesundheits‑Check (Health check)
Doconut registriert einen "doconut"‑Health‑Check, der den Lizenzstatus meldet. Klassisches ASP.NET besitzt keinen eigenen Health‑Endpoint, daher stellen Sie ihn über einen Controller bereit:
// 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");
}Binden Sie ihn in Ihr Monitoring ein, und ein auslaufendes Abonnement wird zu einem Alarm statt zu einem Support‑Ticket. Siehe DoconutHost für die Statuswerte.
Versions‑Upgrades
Eine Lizenz deckt ein Versionsfenster ab. Das Aktualisieren des NuGet‑Pakets auf einen Build neuer als dieses Fenster macht die Lizenz für diesen Build ungültig: IsVersionValid wird zu false und das Öffnen wird blockiert mit einer LicenseException (der Grund steht in License.RejectionMessage) — absichtlich fail‑fast, sodass ein veralteter oder nicht lizenzierter Build beim Deployment erkannt wird, anstatt stillschweigend Produktionsausgaben zu wasserzeichen. Erneuern Sie das Abonnement, ersetzen Sie die .lic in wwwroot und recyceln Sie den Anwendungspool, damit DoconutHost.Initialize die neue Lizenz lädt.
War diese Seite hilfreich?