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 gesetzt ist.

Vier Möglichkeiten, eine Lizenz bereitzustellen

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

LicenseStream übertrifft LicenseContent übertrifft LicensePath übertrifft Auto‑Suche.

Nach Pfad

LicensePath wird exakt so an File.Exists übergeben, wie angegeben. 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 nicht wird auf Auto‑Suche zurückgegriffen — es wird einfach keine Lizenz geladen und der Viewer zeigt ein Wasserzeichen. Auto‑Suche wird nur ausgeführt, wenn weder LicensePath, LicenseContent noch LicenseStream gesetzt ist.

Bevorzugen Sie einen absoluten Pfad (z. B. erstellt aus IWebHostEnvironment.WebRootPath oder AppContext.BaseDirectory), oder lassen Sie LicensePath vollständig weg und verlassen sich auf die unten beschriebene automatische Erkennung.

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

Nach 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
// Priorität: LicenseStream > LicenseContent > LicensePath > Auto‑Suche.
builder.Services.AddDoconut(options =>
{
    options.LicenseStream = licenseStream;
});

Nach Inhalt

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

csharp
// Lizenz‑XML aus einer Datenbank, Umgebungsvariablen 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:
//   1. {CurrentDirectory}/wwwroot
//   2. {CurrentDirectory}/wwwroot/lib
//   3. AppContext.BaseDirectory  (der Build‑Ausgabeordner)
// Es wird nach Doconut.Viewer.lic sowie nach allen per‑Plugin
// Doconut.Viewer.<Capability>.lic‑Dateien daneben gesucht.
builder.Services.AddDoconut();

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

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

Filenames (checked in each directory above, in order):
  Doconut.Viewer.lic                   — Basis‑Viewer‑Lizenz
  Doconut.Viewer.<Capability>.lic      — per‑Plugin‑Lizenz, neben Doconut.Viewer.lic

Kopieren Sie die Lizenz in Ihren Ausgabepfad

LicensePath und die Auto‑Suche‑Prüfung von AppContext.BaseDirectory benötigen beide, dass die .lic‑Datei neben der gebauten Anwendung existiert — nicht nur in Ihrem Quell‑wwwroot. Die Test‑App des SDK kopiert sie bei jedem Build mit diesem 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 aus der Quellcodeverwaltung heraus — stellen Sie sie zusammen mit der Anwendung bereit oder injizieren Sie die Lizenz über LicenseContent oder LicenseStream aus Ihrem Geheimnis‑Store.

Was passiert ohne Lizenz

Eine fehlende Lizenz löst keinen Fehler aus. AddDoconut() gelingt, die Anwendung startet und der Viewer läuft — aber jede Seite trägt ein Evaluationswasserzeichen und es wird keine optionale Fähigkeit gewährt.

Eine gefundene, aber abgelehnte Lizenz ist etwas anderes. Eine ungültige Signatur, Manipulation, Blacklisting oder ein Build außerhalb des Lizenz‑Versionsfensters führt dazu, dass OpenDocumentAsync eine LicenseException mit License.RejectionMessage wirft. Eine zeitlich abgelaufene Lizenz ohne Ablehnungsnachricht bleibt im wasserzeichenbedeckten Modus.

Plugins benötigen Fähigkeiten

Ein Plugin zu registrieren, ohne die entsprechende Berechtigung, ist ein anderer Fall: Bei einer fehlenden Lizenz, einer Legacy‑TRIAL‑Datei oder einer bezahlten Lizenz ohne diese Fähigkeit 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 die Lösung direkt an: Entfernen Sie entweder den Aufruf options.AddPlugin<...>() für dieses Plugin oder installieren Sie eine bezahlte 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 degradieren kann, anstatt beim Neustart abzustürzen; nach Ablauf werden ihre Fähigkeiten 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 AddDoconut()‑Registrierung gelesen. ResetLicense ist derzeit eine Kompatibilitätseigenschaft ohne aktiven Reload‑Pfad, sodass das Ersetzen einer Lizenzdatei einen Neustart der Anwendung erfordert.

Fehlerbehebungsmatrix

SymptomWahrscheinliche UrsachePrüfen
Viewer funktioniert, aber jede Seite ist mit einem Wasserzeichen versehenKeine Lizenz wurde geladen, oder die Lizenz ist zeitlich abgelaufenLösen Sie IDoconutLicenseService; überprüfen Sie das Ausgabeverzeichnis und das Arbeitsverzeichnis des Prozesses
AddDoconut() wirft bei einem 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 wurde bereits erstelltStarten Sie die Anwendung neu
OpenDocumentAsync wirft LicenseExceptionSignatur, Domäne, Versionsfenster, Blacklist oder Laufzeitprüfung 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 dessen, was zur Laufzeit geladen wurde.
  • Fehlerbehebung — Wasserzeichen, abgelehnte Lizenzen und Fähigkeits‑Fehler.

War diese Seite hilfreich?