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 in DoconutOptions — ein Stream, roher Inhalt oder ein Dateipfad — sowie die automatische Erkennung, wenn keine davon gesetzt ist. Wenn mehr als eine gesetzt ist, ist die Priorität eindeutig:

LicenseStream schlägt LicenseContent schlägt LicensePath schlägt automatische Suche.

Per Pfad

LicensePath wird unverändert 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 liegt. Wenn der Pfad nicht aufgelöst werden kann, wirft Doconut keinen Fehler und greift nicht auf die automatische Suche zurück — es lädt einfach keine Lizenz und der Viewer zeigt ein Wasserzeichen an. Die automatische Suche wird nur ausgeführt, wenn weder LicensePath, LicenseContent noch LicenseStream gesetzt ist.

Bevorzugen Sie einen absoluten Pfad (zum Beispiel erstellt aus IWebHostEnvironment.WebRootPath oder AppContext.BaseDirectory), oder lassen Sie LicensePath vollständig weg und setzen Sie stattdessen auf die unten beschriebene automatische Erkennung.

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

Per Stream

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

csharp
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
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 from a database, environment variable, or secret manager —
// no file on disk. Beaten only by LicenseStream.
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
// Configure nothing, and Doconut searches for the license itself:
//   1. {CurrentDirectory}/wwwroot
//   2. {CurrentDirectory}/wwwroot/lib
//   3. AppContext.BaseDirectory  (the build output folder)
// It looks for Doconut.Viewer.lic plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
builder.Services.AddDoconut();

Die zu prüfenden Verzeichnisse in Reihenfolge und die darin gesuchten Dateinamen:

text
1. {CurrentDirectory}/wwwroot
2. {CurrentDirectory}/wwwroot/lib
3. AppContext.BaseDirectory

Filenames (checked in each directory above, in order):
  Doconut.Viewer.lic                   — base viewer license
  Doconut.Viewer.<Capability>.lic      — per-plugin license, alongside Doconut.Viewer.lic

Kopieren Sie die Lizenz in Ihren Ausgabepfad

LicensePath und die AppContext.BaseDirectory‑Prüfung der automatischen Suche benötigen beide, dass die .lic‑Datei neben der erstellten Anwendung existiert — nicht nur in Ihrem Quell‑wwwroot. Die Test‑App des SDK kopiert sie bei jedem Build mit folgendem MSBuild‑Target:

xml
<Target Name="CopyLicensesToOutput" AfterTargets="Build">
  <ItemGroup>
    <DoconutLicenseFiles Include="$(MSBuildProjectDirectory)\wwwroot\*.lic" />
  </ItemGroup>
  <Copy SourceFiles="@(DoconutLicenseFiles)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
</Target>

Halten Sie .lic‑Dateien außerhalb 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

Fehlt eine Lizenz, wird kein Fehler 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 Funktion gewährt.

Eine gefundene, aber abgelehnte Lizenzdatei ist eine andere Situation. Eine ungültige Signatur, Manipulation, Blacklisting oder ein Build außerhalb des Gültigkeitszeitraums der Lizenz führt dazu, dass OpenDocumentAsync eine LicenseException mit License.RejectionMessage wirft. Eine kalender‑abgelaufene Lizenz ohne Ablehnungsnachricht bleibt im Wasserzeichen‑Modus aktiv.

Plugins benötigen Funktionen

Die Registrierung eines Plugins ohne entsprechende Berechtigung ist anders: Bei fehlender Lizenz, einer alten TRIAL‑Datei oder einer kostenpflichtigen Lizenz ohne diese Funktion wirft AddDoconut() eine 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 Ihnen die Lösung direkt an: Entfernen Sie entweder den Aufruf options.AddPlugin<...>() für dieses Plugin oder installieren Sie eine kostenpflichtige Lizenz bzw. eine aktive Temporary/Demo‑Lizenz (NFR), die die Funktion gewährt. Temporäre Registrierungen dürfen ihr Ablaufdatum überleben, sodass eine bereits konfigurierte Anwendung zur Laufzeit degradieren kann, anstatt beim Neustart abzustürzen; nach Ablauf werden ihre Funktionen jedoch wieder entzogen.

Überprüfen Sie die geladene Lizenz

Verwenden Sie IDoconutLicenseService, die gleiche Quelle der Wahrheit, die vom SDK genutzt wird, 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 Registrierung von AddDoconut() gelesen. ResetLicense ist derzeit eine Kompatibilitätseigenschaft ohne aktiven Neuladepfad, sodass das Ersetzen einer Lizenzdatei einen Neustart der Anwendung erfordert.

Fehlersuchmatrix

SymptomWahrscheinliche UrsachePrüfen
Viewer funktioniert, aber jede Seite ist mit Wasserzeichen versehenKeine Lizenz wurde geladen, oder die Lizenz ist kalender‑abgelaufenLösen Sie IDoconutLicenseService; überprüfen Sie das Ausgabeverzeichnis und das Arbeitsverzeichnis des Prozesses
AddDoconut() wirft bei einem 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 wurde 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 — Funktionen, Lizenzstufen und Überprüfung dessen, was zur Laufzeit geladen wurde.
  • Fehlerbehebung — Wasserzeichen, abgelehnte Lizenzen und Funktionsfehler.

War diese Seite hilfreich?