Lizenzierung
Funktionen, Lizenzstufen und der Lizenzservice
Diese Seite ist die Laufzeitreferenz dafür, wie eine Lizenz das Verhalten von Doconut beeinflusst: was jeder Lizenzstatus erlaubt, wie Fähigkeiten gewährt werden und wie man das alles aus dem Code heraus inspiziert. (Zum Laden einer Lizenz siehe Erste Schritte → Lizenz‑Einrichtung.)
Lizenzstatus und ihre Funktionen
| Status | Öffnet Dokumente? | Wasserzeichen | Fähigkeiten |
|---|---|---|---|
| Vollständige (bezahlte) Lizenz (innerhalb ihres Abonnement-/Update‑Fensters) | Ja | Keines | Die gekauften (Has*‑Flags) |
| Temporäre Lizenz (Entwickler/NFR — die Evaluierungslizenz, vor ihrem Ablaufdatum) | Ja | Keines | Alle — pauschale Gewährung (der Evaluierungs‑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, auf der schwarzen Liste, oder ein Build neuer als das Versionsfenster der Lizenz) | Nein — LicenseException bei jedem Öffnen | — | — |
Zwei Konsequenzen, die es zu verinnerlichen gilt:
- Eine fehlende Lizenz ist keine temporäre Lizenz. Ohne Lizenzdatei werden Seiten mit Wasserzeichen dargestellt und keine Fähigkeit (Suche, Annotation, Plugins) ist aktiv. Das voll ausgestattete, wasserzeichenfreie Erlebnis erfordert eine echte Temporäre Lizenz (eine erhalten).
- Nur eine abgelehnte Lizenz blockiert das Öffnen. Das Ablaufdatum von Kalender/Abonnement führt zu einer Darstellung mit Wasserzeichen; aber das Bereitstellen eines Builds neuer als das Versionsfenster der Lizenz wird abgelehnt und schlägt sofort fehl mit einer
LicenseException, sodass Sie den Fehler beim Deployment abfangen — nicht durch stillschweigendes Ausliefern von wasserzeichenbehafteten Ausgaben. Diese Ausnahme (vonOpenDocumentAsync) enthält den Grund ausLicense.RejectionMessage.
Fähigkeiten
Doconut steuert optionale Funktionalität über Fähigkeiten. Heute sind das die optionalen Converter‑ und DICOM‑Plugins sowie die integrierten Search‑ und Annotation‑Funktionen, die jeweils durch Ihre Lizenz gewährt werden. Der Basis‑Viewer ist keine Fähigkeit — er ist die Voraussetzung, sichtbar als IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // Nicht‑TRIAL‑Lizenz vorhanden UND deckt die Version dieses Builds abDas 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 Fähigkeit — einschließlich Fähigkeiten, für die noch kein dediziertes Kauf‑Flag existiert; eine echte, gekaufte Lizenz gewährt exakt ihre Has*‑Flags und ist standardmäßig ablehnend für alles, was nicht zugeordnet ist. (Eine alte TRIAL‑Datei ist keine Berechtigung — sie wird als unlizenziert behandelt: wasserzeichenbehaftet, nichts gewährt.)
Temporäre Lizenzen
Normale Suche und Annotation nutzen ihre bestehenden Fähigkeiten direkt.
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 die Lizenz eingebettet ist |
LicenseExpiry | Das feste Ablaufdatum (DateTime?) |
Die Ablaufsemantik unterscheidet sich je nach Stufe: Eine temporäre Lizenz läuft nur an ihrem LicenseExpiry‑Datum ab (ihr Abonnement‑Fenster wird ignoriert; eine temporäre Lizenz ohne Datum wird als abgelaufen behandelt, ausfallsicher). Jede andere Lizenz läuft an ihrem Abonnement-/Update‑Fenster‑Datum ab.
IDoconutLicenseService‑Referenz
Injizieren Sie IDoconutLicenseService (Namespace Doconut.Core.Interfaces; als Singleton registriert — die Lizenz wird einmal beim Start geparst):
| Mitglied | Bedeutung |
|---|---|
License | Vollständiger DoconutLicenseInfo‑Schnappschuss (unten) |
IsTrial | Eine alte TRIAL‑Datei (als unlizenziert behandelt — keine Berechtigung) |
IsTemporary / ExpiryNote / LicenseExpiry | Markierungen für temporäre Lizenzen |
IsExpired | Abgelaufen gemäß den oben genannten Stufenregeln |
IsVersionValid | Dieser Build liegt innerhalb des Support‑Fensters der Lizenz |
IsViewerLicensed | Nicht‑TRIAL‑Datei gefunden und Version abgedeckt — Grundvoraussetzung |
IsCapabilityGranted(cap) | Das einzige Fähigkeits‑Gate |
HasSearch HasAnnotation HasConverter HasDicom | Freigegebene Kauf‑Flags pro Fähigkeit — verwenden Sie IsCapabilityGranted für die temporär‑bewusste Antwort |
IsValidForDomain(host) | Host‑Abdeckung; V4‑Lizenzen verwenden das Wildcard *.* |
LicenseRejectionReason | Nicht leer ⇒ Öffnen wird mit dieser Meldung blockiert |
DoconutLicenseInfo stellt den benutzerfreundlichen Schnappschuss 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.
// Schalte UI‑Features basierend auf derselben Quelle, die das SDK verwendet
app.MapGet("/api/features", (IDoconutLicenseService lic) => Results.Ok(new
{
viewer = lic.IsViewerLicensed || lic.IsTemporary,
search = lic.IsCapabilityGranted(LicenseCapability.Search),
annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
conversion = lic.HasConverter,
dicom = lic.HasDicom,
}));Gesundheitsprüfung
AddDoconut() registriert einen "doconut"‑Health‑Check, der den Lizenz‑/Ablaufstatus über den Standard‑ASP.NET‑Core‑Mechanismus meldet:
app.MapHealthChecks("/health");Binden Sie ihn in Ihr Monitoring ein und ein ablaufendes Abonnement wird zu einer Warnung statt zu einem Support‑Ticket.
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 false und das Öffnen wird blockiert mit einer LicenseException (der Grund befindet sich in License.RejectionMessage) — bewusst schnell scheitern, sodass ein veralteter oder unlizenzierter Build beim Deployment erkannt wird, anstatt stillschweigend Produktionsausgaben zu wasserzeichen. Erneuern Sie das Abonnement, ersetzen Sie die .lic‑Datei und starten Sie die Anwendung neu, damit AddDoconut() die neue Lizenz lädt.
War diese Seite hilfreich?