Lizenzsetup

Wo Doconut nach Ihrer Lizenzdatei sucht

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

Die Lizenz wird einmal, während AddDoconut() geladen. Das ist eine Änderung gegenüber der vorherigen .NET Standard-Bibliothek, bei der die Lizenz an eine Viewer‑Instanz übergeben oder über die statischen Aufrufe Viewer.DoconutLicense(...) / Viewer.SetLicensePlugin(...) gesetzt wurde. Diese Methoden sind in dieser Version kein Startmechanismus mehr — siehe den Migrationsleitfaden.

Vier Möglichkeiten, eine Lizenz bereitzustellen

Es gibt vier: drei explizite Quellen auf DoconutOptions — ein Stream, roher Inhalt oder ein Dateipfad — sowie die automatische Erkennung, wenn keine davon gesetzt ist. Wenn mehr als eine festgelegt 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 greift nicht auf die Auto‑Suche zurück — es lädt einfach keine Lizenz und der Viewer zeigt Wasserzeichen an. Auto‑Suche wird nur ausgeführt, wenn weder LicensePath, LicenseContent noch LicenseStream gesetzt ist. 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 vollständig weg und verlassen Sie sich auf die automatische Erkennung weiter unten.

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
// License XML aus einer Datenbank, Umgebungsvariable oder Secret Manager —
// Keine Datei auf dem Datenträger. 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 jede pro-Fähigkeit
// Doconut.Viewer.<Capability>.lic Dateien daneben.
builder.Services.AddDoconut();

Die zu prüfenden Ordner, in der Reihenfolge, sowie 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-capability license, alongside the base license

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

Wenn Sie zuvor ein List<string> mit Lizenzpfaden an den Viewer‑Konstruktor übergeben haben — einer pro Fähigkeit — behalten Sie diese Begleitdateien neben Doconut.Viewer.lic und lassen die automatische Erkennung sie aufnehmen. Es gibt keine Option für eine Pfadliste bei DoconutOptions.

Lizenz in Ihren Ausgabepfad kopieren

Wenn der Prozess nicht aus dem Projektordner ausgeführt wird — eine veröffentlichte Anwendung, IIS, ein Container, ein Test‑Runner — verfehlt die erste Suche, 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 ebenfalls aus der Ausgabe entfernt wird. -->
  <Delete Files="@(StaleOutputLicenses)" />
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)wwwroot" />
</Target>

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

Halten Sie .lic‑Dateien aus der Versionskontrolle — setzen Sie sie neben die Anwendung, oder injizieren Sie die Lizenz über LicenseContent bzw. LicenseStream aus Ihrem Geheimnis‑Store.

Was passiert ohne Lizenz

Fehlt eine Lizenz, wird keine Ausnahme geworfen. AddDoconut() schlägt erfolgreich ab, die Anwendung startet und der Viewer läuft — jedoch trägt jede Seite ein Evaluations‑Wasserzeichen und es wird keine optionale Fähigkeit gewährt.

Eine gefundene, aber abgelehnte Lizenzdatei ist ein anderer Fall. Eine ungültige Signatur, Manipulation, Blacklisting oder ein Build außerhalb des Versionsfensters der Lizenz führt dazu, dass OpenDocumentAsync eine Ausnahme LicenseException mit License.RejectionMessage wirft. Eine kalenderabgelaufene Lizenz, die keine Ablehnungsnachricht liefert, bleibt im Wasserzeichen‑Modus aktiv.

Plugins benötigen Fähigkeiten

Ein Plugin zu registrieren, ohne die entsprechende Berechtigung, ist ein anderer Fall: Bei einer fehlenden Lizenz, einer veralteten TRIAL‑Datei oder einer kostenpflichtigen Lizenz ohne diese Fähigkeit wirft AddDoconut() eine Ausnahme InvalidOperationException, sodass die Anwendung nicht startet. Beispiel: Registrierung des Converter‑Plugins ohne 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 sofort aus: 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 herabgestuft werden kann, anstatt beim Neustart abzustürzen; nach Ablauf werden ihre Fähigkeiten weiterhin entzogen.

Geladene Lizenz überprüfen

Verwenden Sie IDoconutLicenseService, die gleiche zuverlässige Quelle, die das SDK nutzt, um einen authentifizierten Diagnose‑Endpoint 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 Neuladepfad, sodass das Ersetzen einer Lizenzdatei einen Neustart der Anwendung erfordert.

Fehlersuchmatrix

SymptomWahrscheinliche UrsachePrüfung
Viewer funktioniert, aber jede Seite ist mit Wasserzeichen versehenKeine Lizenz wurde geladen, oder die Lizenz ist kalenderabgelaufenBeheben Sie IDoconutLicenseService; prüfen Sie das Ausgabeverzeichnis und das Arbeitsverzeichnis des Prozesses
AddDoconut() wirft für ein PluginDie Lizenz gewährt diese Plugin‑Funktion 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, Domäne, Versionsfenster, Blacklist oder Laufzeitgate des Plugins hat die Lizenz abgelehntLesen Sie die Ausnahme‑/Ablehnungsnachricht, ohne sie unzuverlässigen Clients preiszugeben
Eine pro‑Funktion‑Lizenz funktionierte früher, jetzt jedoch nichtDer alte Code übergab explizite Lizenzpfade an den Viewer‑KonstruktorVerschieben Sie die zugehörigen .lic‑Dateien neben Doconut.Viewer.lic und lassen Sie die automatische Erkennung sie laden

Nächste Schritte

  • Lizenzierung — Funktionen, Lizenzstufen und die Überprüfung, was zur Laufzeit geladen wurde.
  • Fehlerbehebung — Wasserzeichen, abgelehnte Lizenzen und Funktionsfehler.

War diese Seite hilfreich?