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?WasserzeichenFähigkeiten
Vollständige (bezahlte) Lizenz (innerhalb ihres Abonnement‑/Update‑Fensters)JaKeineDie erworbenen (Has*‑Flags)
Temporäre Lizenz (Entwickler/NFR — die Evaluationslizenz, vor ihrem Ablaufdatum)JaKeineAlle — Pauschalgewährung (der Evaluations‑Trichter)
Abgelaufen (eine temporäre Lizenz nach ihrem Ablaufdatum oder ein bezahltes Abonnement nach seinem Erneuerungsdatum)JaEvaluierungs‑WasserzeichenKeine gewährt
Keine Lizenzdatei vorhandenJaEvaluierungs‑WasserzeichenKeine 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 LicenseException aus, sodass Sie den Fehler beim Deployment abfangen — nicht durch stilles Ausliefern von wasserzeichen‑gekennzeichneten Ausgaben. Diese Ausnahme (von OpenDocumentAsync) enthält den Grund aus License.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:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's version

Das einzige Gate, das die gesamte Pipeline verwendet, ist IsCapabilityGranted:

csharp
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:

MitgliedBedeutung
IsTemporaryEin ExpiryNote‑Tag ist vorhanden (Erkennung erfolgt über das Vorhandensein des Tags — der Text des Hinweises wird nie verglichen, er ist dynamisch)
ExpiryNoteInformations‑Text, der in der Lizenz eingebettet ist
LicenseExpiryDas 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:

MitgliedBedeutung
LicenseVollständiger DoconutLicenseInfo‑Snapshot (siehe unten)
IsTrialEine Legacy‑TRIAL‑Datei (als nicht lizenziert behandelt — keine Berechtigung)
IsTemporary / ExpiryNote / LicenseExpiryMarker für temporäre Lizenzen
IsExpiredNach den oben genannten Stufenregeln abgelaufen
IsVersionValidDieser Build liegt innerhalb des Lizenz‑Support‑Fensters
IsViewerLicensedNicht‑TRIAL‑Datei gefunden und Version abgedeckt — Basis‑Voraussetzung
IsCapabilityGranted(cap)Das einzelne Capability‑Gate
HasSearch HasAnnotation HasConverter HasDicomFreigegebene pro‑Capability‑Kauf‑Flags — verwenden Sie IsCapabilityGranted für die temporär‑bewusste Antwort
IsValidForDomain(host)Host‑Abdeckung; V4‑Lizenzen nutzen das Platzhalter‑Muster *.*
LicenseRejectionReasonNicht‑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.

csharp
// 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:

csharp
// 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?