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.
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.
// 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:
// 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:
// 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:
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.licKopieren 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:
<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 überLicenseContentoderLicenseStreamaus 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:
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.
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
| Symptom | Wahrscheinliche Ursache | Prüfen |
|---|---|---|
| Viewer funktioniert, aber jede Seite ist mit Wasserzeichen versehen | Keine Lizenz wurde geladen, oder die Lizenz ist kalender‑abgelaufen | Lösen Sie IDoconutLicenseService; überprüfen Sie das Ausgabeverzeichnis und das Arbeitsverzeichnis des Prozesses |
AddDoconut() wirft bei einem Plugin | Die Lizenz gewährt diese Plugin‑Funktion nicht | Prüfen Sie IsCapabilityGranted(...) und entfernen Sie Registrierungen, die Sie nicht erworben haben |
| Ein konfigurierter relativer Pfad funktioniert lokal, aber nicht in IIS/Container | Das Arbeitsverzeichnis des Prozesses hat sich geändert | Verwenden Sie AppContext.BaseDirectory oder einen absoluten Pfad |
Ersetzte .lic‑Datei hat keine Wirkung | Der Singleton‑Lizenzservice wurde bereits erstellt | Starten Sie die Anwendung neu |
OpenDocumentAsync wirft LicenseException | Signatur, Domain, Versionsfenster, Blacklist oder Laufzeit‑Gate des Plugins hat die Lizenz abgelehnt | Lesen 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?