Lizenzsetup

Wo Doconut nach Ihrer Lizenzdatei sucht

Ohne Lizenz rendert Doconut weiterhin Dokumente — jede Seite trägt lediglich ein Evaluations‑Wasserzeichen. Diese Seite beschreibt die vier Möglichkeiten, eine Lizenz bereitzustellen, und die genaue Priorität, wenn mehr als eine festgelegt ist.

Vier Möglichkeiten, eine Lizenz bereitzustellen

Es gibt vier: drei explizite Quellen auf DoconutOptions — ein Stream, roher Inhalt oder ein Dateipfad — plus automatische Erkennung, wenn keine davon gesetzt ist. Wenn mehr als eine gesetzt ist, ist die Priorität exakt:

LicenseStream schlägt LicenseContent schlägt LicensePath schlägt Auto‑Suche.

Per Pfad

LicensePath wird exakt so an File.Exists übergeben. Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis des Prozesses aufgelöst — nicht zu Ihrem Projektordner und nicht zu dem Ordner, in dem Program.cs lebt. Wenn der Pfad nicht aufgelöst werden kann, wirft Doconut keinen Fehler und fällt nicht auf die automatische Suche zurück — es lädt einfach keine Lizenz und der Viewer versieht die Seiten mit Wasserzeichen. Die automatische Suche wird nur ausgeführt, wenn weder LicensePath, LicenseContent noch LicenseStream gesetzt sind. Die pro‑Plugin‑Lizenzdateien im selben Ordner (Doconut.Viewer.<Capability>.lic) werden dabei gelesen, sodass LicensePath und AddPlugin<...>() zusammenarbeiten, wenn die Plugin‑Lizenzen neben der Basislizenz liegen.

Bevorzugen Sie einen absoluten Pfad (zum Beispiel erstellt aus IWebHostEnvironment.WebRootPath oder AppContext.BaseDirectory) oder lassen Sie LicensePath komplett weg und verlassen Sie sich auf die unten beschriebene automatische Erkennung.

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath = Path.Combine(AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
});

Per Stream

LicenseStream wird einmal beim Start gelesen — nützlich, wenn die Lizenz aus einem geheimen Speicher stammt statt aus einer Datei auf der Festplatte.

csharp
// Priorität: LicenseStream > LicenseContent > LicensePath > Auto-Suche.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

Per Inhalt

LicenseContent akzeptiert den Lizenztext selbst — aus einer Umgebungsvariable, einer Datenbank oder einem Geheimnis‑Manager:

csharp
// Lizenz-XML aus einer Datenbank, Umgebungsvariable oder Geheimnis-Manager —
// Keine Datei auf der Festplatte. Nur von LicenseStream übertroffen.
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

Automatische Erkennung

Konfigurieren Sie keine der drei expliziten Quellen, und Doconut sucht die Lizenz selbst:

csharp
// Nichts konfigurieren, und Doconut sucht die Lizenz selbst, nur in diesen beiden Ordnern:
//   1. {CurrentDirectory}/wwwroot
//   2. {AppContext.BaseDirectory}/wwwroot   (wwwroot im Build-Ausgabeordner)
// Es sucht zuerst nach Doconut.lic, dann nach Doconut.Viewer.lic, plus alle pro-Plugin
// Doconut.Viewer.<Capability>.lic-Dateien daneben.
builder.Services.AddDoconut();

Die zu prüfenden Ordner, in Reihenfolge, und die in jedem gesuchten Dateinamen:

text
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-plugin license, alongside the base license

Nichts außerhalb eines wwwroot‑Ordners wird gelesen: ein .lic im Ausgabeverzeichnis selbst oder in wwwroot/lib wird ignoriert.

Kopieren Sie die Lizenz in Ihren Ausgabepfad

Wenn der Prozess nicht aus dem Projektordner ausgeführt wird — eine veröffentlichte Anwendung, IIS, ein Container, ein Test‑Runner — verfehlt die erste Prüfung, und die zweite, {AppContext.BaseDirectory}/wwwroot, muss die Datei finden. Die eigene Test‑App des SDK kopiert die Lizenzen bei jedem Build mit diesem MSBuild‑Target dorthin:

xml
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
  <ItemGroup>
    <DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
    <StaleOutputLicenses Include="$(OutDir)wwwroot\*.lic" />
  </ItemGroup>
  <!-- Zuerst löschen, damit das Umbenennen oder Entfernen einer .lic in wwwroot sie auch aus der Ausgabe entfernt. -->
  <Delete Files="@(StaleOutputLicenses)" />
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>

Das Ziel muss $(OutDir)wwwroot sein: ein .lic, das in das Ausgabeverzeichnis kopiert wird, wird von der automatischen Suche nie gefunden. Die LicensePath‑Beispiele auf dieser Seite verweisen auf denselben Ort.

Halten Sie .lic‑Dateien aus der Versionskontrolle — stellen Sie sie zusammen mit der Anwendung bereit oder injizieren Sie die Lizenz über LicenseContent oder LicenseStream aus Ihrem geheimen Speicher.

Was passiert ohne Lizenz

Eine fehlende Lizenz wirft keinen Fehler. AddDoconut() gelingt, die Anwendung startet und der Viewer läuft — aber jede Seite trägt ein Evaluations‑Wasserzeichen und keine optionalen Fähigkeiten werden gewährt.

Eine gefundene, aber abgelehnte Lizenzdatei ist anders. Eine ungültige Signatur, Manipulation, Blacklisting oder ein Build außerhalb des Versionsfensters der Lizenz veranlasst OpenDocumentAsync, LicenseException mit License.RejectionMessage auszulösen. Eine kalenderabgelaufene Lizenz ohne Ablehnungsnachricht läuft weiter im Wasserzeichenmodus.

Plugins benötigen Fähigkeiten

Das Registrieren eines Plugins ohne entsprechende Berechtigung ist anders: Bei einer fehlenden Lizenz, einer veralteten TRIAL‑Datei oder einer kostenpflichtigen Lizenz ohne diese Fähigkeit wirft AddDoconut() InvalidOperationException, sodass die Anwendung nicht startet. Zum Beispiel das Registrieren des Converter‑Plugins ohne eine Lizenz, die Converter gewährt:

text
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.

Die Meldung gibt die Lösung direkt an: Entfernen Sie entweder den options.AddPlugin<...>()‑Aufruf für dieses Plugin oder installieren Sie eine kostenpflichtige Lizenz bzw. eine aktive Temporary/Demo (NFR)‑Lizenz, die die Fähigkeit gewährt. Temporäre Registrierungen dürfen ihr Ablaufdatum überleben, sodass eine bereits konfigurierte Anwendung zur Laufzeit degradiert statt beim Neustart abzustürzen; nach Ablauf werden ihre Fähigkeiten jedoch weiterhin widerrufen.

Überprüfen der geladenen Lizenz

Verwenden Sie IDoconutLicenseService, die gleiche zuverlässige Quelle wie das SDK, um einen authentifizierten Diagnose‑Endpunkt bereitzustellen oder Feature‑Flags zu steuern. Geben Sie keine Lizenzinhalte oder Schlüssel zurück.

csharp
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
}));

Die Lizenz wird während der AddDoconut()‑Registrierung gelesen. ResetLicense ist derzeit eine Kompatibilitätseigenschaft ohne aktiven Neulade‑Pfad, daher erfordert das Ersetzen einer Lizenzdatei einen Neustart der Anwendung.

Fehlersuchmatrix

SymptomWahrscheinliche UrsachePrüfung
Viewer funktioniert, aber jede Seite ist mit Wasserzeichen versehenKeine Lizenz wurde geladen, oder die Lizenz ist kalenderabgelaufenLösen Sie IDoconutLicenseService; überprüfen Sie das Ausgabeverzeichnis und das Arbeitsverzeichnis des Prozesses
AddDoconut() wirft für ein PluginDie Lizenz gewährt diese Plugin‑Fähigkeit nichtPrüfen Sie IsCapabilityGranted(...) und entfernen Sie Registrierungen, die Sie nicht erworben haben
Ein konfigurierter relativer Pfad funktioniert lokal, aber nicht in IIS/ContainerDas Arbeitsverzeichnis des Prozesses hat sich geändertVerwenden Sie AppContext.BaseDirectory oder einen absoluten Pfad
Ersetzte .lic‑Datei hat keine WirkungDer Singleton‑Lizenzservice war bereits erstelltStarten Sie die Anwendung neu
OpenDocumentAsync wirft LicenseExceptionSignatur, Domain, Versionsfenster, Blacklist oder Laufzeit‑Gate des Plugins hat die Lizenz abgelehntLesen Sie die Ausnahme‑/Ablehnungsnachricht, ohne sie unzuverlässigen Clients preiszugeben

Nächste Schritte

  • Lizenzierung — Fähigkeiten, Lizenzstufen und Überprüfung, was zur Laufzeit geladen wurde.
  • Fehlerbehebung — Wasserzeichen, abgelehnte Lizenzen und Fähigkeitsfehler.

War diese Seite hilfreich?