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.
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.
// 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:
// 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:
// 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:
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.licKopieren 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:
<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 überLicenseContentoderLicenseStreamaus 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:
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.
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
| Symptom | Wahrscheinliche Ursache | Prüfen |
|---|---|---|
| Viewer funktioniert, aber jede Seite ist mit einem Wasserzeichen versehen | Keine Lizenz wurde geladen, oder die Lizenz ist zeitlich 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‑Fähigkeit 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, Domäne, Versionsfenster, Blacklist oder Laufzeitprüfung des Plugins hat die Lizenz abgelehnt | Lesen 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?