DoconutErweiterungen
Registrierung von Diensten und Middleware
DoconutExtensions (Namespace Doconut.Middleware) ist die statische Klasse mit den drei Aufrufen, die jeder Doconut-Host macht: eine Service-Registrierung und zwei Middleware-Registrierungen.
builder.Services.AddDoconut(options => { /* … */ });
// …
app.UseDoconutResources(); // VOR UseDoconut()
app.UseDoconut();AddDoconut
IServiceCollection AddDoconut(this IServiceCollection services, Action<DoconutOptions>? configure = null)Erstellt das DoconutOptions, validiert sie sofort (siehe DoconutOptions → Startup-Validierung) und registriert den vollständigen Service-Graphen:
| Dienst | Lebensdauer | Rolle |
|---|---|---|
DoconutOptions | Singleton | Das Konfigurationsobjekt |
| Session-Cache-Dienst | Singleton | Token → Session-Cache (IMemoryCache ist ebenfalls registriert) |
IDoconutLicenseService | Singleton | Lizenz, die einmal beim Start geladen wird (Priorität: LicenseStream → LicenseContent → LicensePath → Auto‑Suche) |
| Page-Image-Pipeline | Singleton | Führt Bildverarbeitung für Seiten durch (Wasserzeichen, Drehen, Skalieren, Anmerkungen) |
| Dokumentensicherheit (Zugriffs‑Store) | Singleton | Gewährt Bindungen von Token zu Session |
Viewer | Transient | Die öffentliche Öffnen/Schließen‑Fassade |
DocumentConverter | Transient | Konvertierungs‑Fassade — erfordert das Converter‑Plugin |
DistributedDocumentPublisher | — | Veröffentlicht die Artefakte eines Dokuments im gemeinsamen Speicher |
Health‑Check "doconut" | — | Meldet Lizenz‑/Ablaufstatus über ASP.NET Health Checks |
Es gibt keinen entsprechenden Aufruf in der vorherigen .NET Standard‑Bibliothek. Sie erstellte new Viewer(cache, accessor) pro Anfrage und übergab Optionen an die Middleware; beide werden durch diese einzelne Registrierung ersetzt.
Zwei Verhaltensweisen, die es zu kennen gilt:
- Converter erfordert sein Plugin. Das Auflösen von
DocumentConverterohneoptions.AddPlugin<ConverterPlugin>()wirft:
InvalidOperationException: No IDocumentConverter is registered. Add the converter plugin: options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>().- Plugin‑Berechtigung wird beim Start validiert. Eine fehlende Lizenz, eine veraltete
TRIAL‑Datei oder eine kostenpflichtige Lizenz ohne registrierte Plugin‑Fähigkeit schlägt zurAddDoconut()‑Zeit fehl. Temporäre/Demo‑Registrierungen überleben ihr Ablaufdatum, während Laufzeit‑Gates die abgelaufenen Fähigkeiten widerrufen.
Der Health‑Check integriert sich in den Standard‑ASP.NET Core‑Mechanismus — binden Sie ihn ein, wenn Sie den Lizenzstatus an Ihrem Health‑Endpunkt sehen möchten:
app.MapHealthChecks("/health");UseDoconut
IApplicationBuilder UseDoconut(this IApplicationBuilder app)Fügt die Doconut Page‑Image‑Middleware hinzu. Sie beantwortet jede Anfrage, die einen ?token=‑Abfrageparameter enthält — Seiten, Thumbnails, Suche, Anmerkungen, Seitenaktionen (die vollständige Anfragetabelle befindet sich in Core Concepts → How the Viewer Works). Wenn UnsafeMode false ist, wird die Dokumentensicherheits‑Schicht automatisch davor eingebunden.
Sie nimmt keine Argumente entgegen. Das Übergeben einer DoconutOptions‑Instanz hier war das Muster der vorherigen Bibliothek und kompiliert nicht mehr.
Das Referenzbeispiel leitet die Anfragen des Widgets über einen Pfadzweig, wobei die historische Anfragestruktur beibehalten wird:
app.MapWhen(
ctx => ctx.Request.Path.Value?.EndsWith("DocImage.axd", StringComparison.OrdinalIgnoreCase) == true,
branch => branch.UseDoconut());UseDoconutResources
IApplicationBuilder UseDoconutResources(this IApplicationBuilder app)Stellt das eingebettete JS, CSS, Bilder und Schriftarten unter DoconutOptions.ResourcesPath (Standard /doconut-res) bereit. Dies sind die Dateien, für die Viewer.ReferenceCss() / ReferenceScripts() Tags erzeugen.
Rufen Sie es immer vor UseDoconut() auf. Wenn der Viewer‑Bereich leer bleibt und die Browser‑Konsole 404‑Fehler für /doconut-res/... anzeigt, fehlt dieser Aufruf oder ist falsch platziert.
Dies ist der unterstützte Ersatz für das manuelle Einbinden der Middleware zur Behandlung eingebetteter Ressourcen.
Bereitstellung aus gemeinsamem Speicher
Zwei weitere Registrierungen existieren für Deployments, bei denen der Knoten, der ein Dokument rendert, nicht unbedingt der Knoten ist, der dessen Seiten bereitstellt. Beide werden end‑to‑end in Distributed Deployments behandelt; die Signaturen sind:
IServiceCollection AddDoconutDistributedAsyncPublish(...) // opt-in Hintergrund-Veröffentlichungswarteschlange
IServiceCollection AddDoconutDistributedWidgets(...) // gemeinsamer Sicherungsspeicher für widget-UploadsDie Leseseite ist eine separate Middleware aus dem Doconut.Clouds‑Paket:
IApplicationBuilder UseDoconutCloud<THandler>(
this IApplicationBuilder app,
Action<CloudOptions>? configure = null,
string pathPrefix = "/doconut-cloud")
where THandler : BaseCloudHandlerUseDoconutWebFarm(...) und WebFarmOptions existieren in dieser Version nicht. Siehe den Migrationsleitfaden für die Einstellung‑für‑Einstellung‑Zuordnung.
Zusammenfassung der Reihenfolge
app.UseRouting();
app.UseSession(); // erforderlich, wenn UnsafeMode = false
app.UseDoconutResources(); // 1. Doconut-Aufruf
app.UseDoconut(); // 2. Doconut-Aufruf (oder über einen MapWhen-Zweig)War diese Seite hilfreich?