Lizenzsetup

Wo Doconut nach Ihrer Lizenzdatei unter IIS sucht

Ohne Lizenz rendert Doconut weiterhin Dokumente — jede Seite trägt lediglich ein Evaluationswasserzeichen. Diese Seite beschreibt die vier Möglichkeiten, eine Lizenz in Global.asax bereitzustellen, wo Doconut nachschaut, wenn Sie keine angeben, und was passiert, wenn die Lizenz eines Plugins fehlt.

Vier Möglichkeiten, eine Lizenz bereitzustellen

Es gibt drei explizite Quellen in DoconutOptions — einen Dateipfad, einen Stream oder rohen Inhalt — plus automatische Erkennung, wenn keine davon gesetzt ist. Alle werden einmalig in DoconutHost.Initialize gelesen. Wenn mehr als eine gesetzt ist, ist die Priorität exakt:

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

Per Pfad

Geben Sie LicensePath einen vollständigen Pfad. Ein relativer Pfad wird relativ zum aktuellen Verzeichnis des Prozesses aufgelöst, und unter IIS ist das der eigene Ordner des Worker-Prozesses, nicht Ihre Site. HostingEnvironment.MapPath wandelt einen site-relativen Pfad in einen vollständigen Pfad um:

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
});

Wenn die Datei nicht existiert, wirft Doconut keinen Fehler und greift nicht auf die automatische Erkennung zurück: Es wird keine Lizenz geladen und der Viewer fügt Wasserzeichen ein. Die per‑Plugin‑Lizenzdateien im selben Ordner (Doconut.Viewer.<Capability>.lic) werden zusammen damit gelesen, sodass LicensePath und AddPlugin<...>() zusammenarbeiten, wenn die Plugin‑Lizenzen neben der Basislizenz liegen.

Per Stream

LicenseStream wird einmalig beim Start gelesen — nützlich, wenn die Lizenz aus einer eingebetteten Ressource oder einem Geheimspeicher stammt, anstatt aus einer Datei auf dem Datenträger.

csharp
// Precedence: LicenseStream > LicenseContent > LicensePath > auto-search.
Doconut.DoconutHost.Initialize(options =>
{
    options.LicenseStream = licenseStream;
});

Per Inhalt

LicenseContent übernimmt den Lizenztext selbst — aus einer Umgebungsvariablen, einer Datenbank oder einem Geheimspeicher — sodass keine Lizenzdatei mit der Site bereitgestellt werden muss.

csharp
// License XML from a database, an environment variable or a secret store -
// no file on disk. Beaten only by LicenseStream.
Doconut.DoconutHost.Initialize(options =>
{
    options.LicenseContent = Environment.GetEnvironmentVariable("DOCONUT_LICENSE") ?? "";
});

Automatische Erkennung

Setzen Sie keine der drei Optionen, und Doconut sucht die Lizenz selbst:

csharp
// Configure nothing, and Doconut searches for the license itself, in this order:
//   1. {CurrentDirectory}\wwwroot
//   2. {AppContext.BaseDirectory}\wwwroot   (under IIS: the site's root folder)
// It looks for Doconut.lic first, then Doconut.Viewer.lic, plus any per-plugin
// Doconut.Viewer.<Capability>.lic files alongside it.
Doconut.DoconutHost.Initialize();

Die beiden Ordner, in dieser Reihenfolge, und die gesuchten Dateien:

text
1. {CurrentDirectory}\wwwroot
2. {AppContext.BaseDirectory}\wwwroot

In each folder:
  Doconut.lic                        — if found, this is the only file read
  Doconut.Viewer.lic                 — base viewer license
  Doconut.Viewer.<Capability>.lic    — per-plugin licenses, read only next to Doconut.Viewer.lic

Unter IIS und IIS Express ist AppContext.BaseDirectory der Stammordner der Site — der Ordner, der Web.config enthält — nicht dessen bin‑Ordner. Daher gehört die Lizenz in wwwroot unter dem Site‑Stammordner:

text
MySite\
  Web.config
  Global.asax
  bin\
  wwwroot\
    Doconut.Viewer.lic
    Doconut.Viewer.Converter.lic

Im Projekt halten Sie wwwroot\*.lic neben Web.config und stellen den Ordner mit der Site bereit. Kein Build‑Schritt muss sie irgendwohin kopieren. Eine .lic an irgendeinem anderen Ort — in bin\, neben Web.config oder in einem Unterordner von wwwroot — wird nie gelesen.

Halten Sie .lic‑Dateien außerhalb der Versionskontrolle. Stellen Sie sie zusammen mit der Site bereit oder liefern Sie die Lizenz über LicenseContent oder LicenseStream aus Ihrem Geheimspeicher.

Was passiert ohne Lizenz

Eine fehlende Lizenz löst keinen Fehler aus. DoconutHost.Initialize schlägt erfolgreich ab, die Site startet und der Viewer läuft, aber jede Seite trägt ein Evaluationswasserzeichen und keine optionale Funktion wird gewährt.

Eine gefundene, aber abgelehnte Lizenzdatei ist etwas anderes. Eine ungültige Signatur, Manipulation oder ein Build außerhalb des Versionsfensters der Lizenz lässt OpenDocumentAsync eine LicenseException mit dem Grund auslösen.

Plugins benötigen ihre Lizenz beim Start

Die Registrierung eines Plugins, dessen Fähigkeit von keiner Lizenz gewährt wird, stoppt die Anwendung beim Start. DoconutHost.Initialize wirft in Application_Start:

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.

Unter System.Web sehen Sie diese Meldung nicht im Browser. Jede Anfrage an die Site liefert ein leeres 500 — keine Fehlerseite, kein Stack‑Trace, nichts im IIS‑Log. Die Ausnahme wird nur im Windows‑Ereignisprotokoll (Anwendungsprotokoll, Quelle ASP.NET) aufgezeichnet. Wenn die gesamte Site sofort nach dem Hinzufügen einer AddPlugin‑Zeile nicht mehr reagiert, prüfen Sie die Lizenzdateien in wwwroot vor dem Code: Die Doconut.Viewer.<Capability>.lic des Plugins muss neben Doconut.Viewer.lic liegen, und ohne die Basislizenz werden die Plugin‑Dateien überhaupt nicht gelesen.

Überprüfen der geladenen Lizenz

IDoconutLicenseService ist die gleiche Wahrheitsquelle, die das SDK verwendet. Lösen Sie sie aus DoconutHost.Services auf, um einen authentifizierten Diagnose‑Endpunkt bereitzustellen oder Feature‑Flags zu steuern — geben Sie niemals Lizenzinhalte zurück:

csharp
// GET /License/Status
public ActionResult Status()
{
    var license = Doconut.DoconutHost.Services.GetRequiredService<IDoconutLicenseService>();

    return Json(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
    }, JsonRequestBehavior.AllowGet);
}

Die Lizenz wird einmalig in DoconutHost.Initialize gelesen. Nach dem Ersetzen einer Lizenzdatei den Anwendungspool neu starten (oder Web.config berühren), damit Application_Start erneut ausgeführt wird.

Fehlerbehebung

SymptomWahrscheinliche UrsachePrüfung
Viewer funktioniert, aber jede Seite ist mit Wasserzeichen versehenKeine Lizenz gefundenIst die .lic in <site root>\wwwroot? Rufen Sie den oben genannten Status‑Endpunkt auf
Jede Anfrage liefert ein leeres 500 direkt nach dem Hinzufügen eines PluginsEin registriertes Plugin hat keine Lizenz, die es gewährtWindows‑Ereignisprotokoll, Quelle ASP.NET; die .lic des Plugins neben Doconut.Viewer.lic
LicensePath funktioniert auf Ihrem Rechner, aber nicht auf dem ServerEin relativer Pfad, der gegen den Ordner des Worker‑Prozesses aufgelöst wirdErstellen Sie ihn mit HostingEnvironment.MapPath("~/wwwroot/...")
Eine ersetzte .lic‑Datei hat keine WirkungDie Lizenz wurde beim Start der Anwendung gelesenDen Anwendungspool neu starten
OpenDocumentAsync wirft LicenseExceptionDie Lizenz wurde gefunden, aber abgelehntLesen Sie die Fehlermeldung; zeigen Sie sie nicht unzuverlässigen Clients

Nächste Schritte

  • Lizenzierung — Funktionen und wie man sie zur Laufzeit prüft.
  • Fehlerbehebung — Wasserzeichen, Startfehler und andere Symptome.

War diese Seite hilfreich?