
Erstellen Sie einen sicheren Dokumentenverwaltungs‑Viewer in .NET mit Doconut
Implementierung der Dokumentenverwaltung mit Doconut
Ein Dokumentenverwaltung‑Workflow in einem .NET‑Portal benötigt in der Regel drei Dinge:
- Eine Möglichkeit, PDFs, Office‑Dateien, CAD‑Zeichnungen oder Bilder zu laden, ohne einen Viewer von Grund auf neu zu schreiben.
- Ein sicheres Token, das das geladene Dokument mit der aktuellen Browsersitzung verknüpft.
- Ein Aufräum‑Schritt, der den Speicher freigibt, sobald der Benutzer fertig ist.
Doconut bietet alle drei über einen einzigen Viewer‑Dienst, eine leichtgewichtige IMemoryCache‑Sitzung und explizite CloseDocument‑Aufrufe.
1. Registrieren Sie den Viewer im DI‑Container
Während des Anwendungsstarts fügen Sie Doconut‑Dienste dem DI‑Container hinzu, indem Sie die in der offiziellen Dokumentation beschriebene Doconut‑Registrierungsmethode aufrufen. Dieser Schritt registriert den Viewer, die Lizenzverwaltung und den In‑Memory‑Cache, der Dokument‑Sitzungen speichert.
Die Registrierung prüft die Lizenz beim Start, sodass fehlende oder ungültige Lizenzen sofort fehlschlagen und Sie das Problem kennen, bevor die erste Anfrage den Server erreicht.
2. Fügen Sie die Middleware ein, die Seitenbilder, Vorschaubilder und Annotationsdaten bereitstellt
Konfigurieren Sie die Doconut‑Middleware in der Anforderungspipeline, sodass jede Anfrage, die einen ?token=‑Abfrageparameter enthält, von Doconut verarbeitet wird. Die Middleware erzwingt das Standard‑Sicherheits‑Marker (secure-{token}), wenn UnsafeMode false (der Standard) ist, und liefert Seitenbilder, Vorschaubilder sowie Annotationsdaten.
Durch das Platzieren der Middleware auf einem dedizierten Zweig bleibt der Rest Ihrer Pipeline unverändert und ermöglicht horizontales Skalieren ohne Sticky‑Sessions.
3. Öffnen Sie ein Dokument und erhalten Sie das undurchsichtige Sitzungs‑Token
Erstellen Sie einen einzigen Endpunkt, der einen Dateipfad (oder einen Stream) entgegennimmt und das Token zurückgibt. Das Token ist das einzige Anmeldemerkmal, das das Client‑Widget jemals sieht.
app.MapPost("/api/open", async (Viewer viewer) =>
{
// Das Token ist undurchsichtig — übergebe es dem widget, protokolliere es nie und speichere es nicht.
string token = await viewer.OpenDocumentAsync("wwwroot/files/Contract.pdf");
return Results.Ok(new { token });
});
Was passiert innerhalb von OpenDocumentAsync
- Lizenz‑Gate – eine ungültige Lizenz wirft
LicenseExceptionsofort. - Sitzungserstellung – Doconut wählt den passenden Format‑Viewer (PDF, Word, DWG, …) und speichert die Engine in
IMemoryCacheunter einem GUID‑Token. - Sicherheitsregistrierung – mit
UnsafeMode = falsewird das Token über einensecure-{token}‑Marker an die ASP.NET‑Sitzung des Aufrufers gebunden. Nur diese Browsersitzung kann Seiten anfordern. - Token‑Rückgabe – der Client erhält das Token und verwendet es für jede nachfolgende Anfrage (
/DocImage.axd?token=…).
Die standardmäßige gleitende Ablaufzeit beträgt 60 Minuten (konfigurierbar über DocOptions.TimeOut). Jede Seitenanfrage setzt den Timer zurück, sodass inaktive Sitzungen automatisch verschwinden.
4. Rendern Sie das Dokument auf der Client‑Seite
Aus dem Browser rufen Sie den Endpunkt auf, holen das Token und übergeben es dem Doconut‑Widget:
fetch('/api/open', { method: 'POST' })
.then(r => r.json())
.then(d => {
const token = d.token;
objViewer.View(token); // JavaScript-Widget bereitgestellt von Doconut
});
Das Widget sendet intern Seiten‑, Vorschaubild‑, Such‑ und Annotationsanfragen, die alle dasselbe token enthalten. Da das Token an die serverseitige Sitzung gebunden ist, kann ein bösartiger Benutzer nicht das Dokument eines anderen Benutzers übernehmen.
5. Schließen Sie das Dokument, sobald der Benutzer den Viewer verlässt
Bei großen PDFs oder CAD‑Dateien sollten Sie die Rendering‑Engine sofort freigeben. Rufen Sie CloseDocument von einem serverseitigen Endpunkt oder aus dem „unload“-Ereignis des Widgets auf.
// Server‑seitiger Endpunkt
app.MapPost("/api/close", (Viewer viewer, string token) =>
{
viewer.CloseDocument(token);
return Results.Ok();
});
// Direkter Aufruf vom widget (wenn du das Token dem Backend aussetzt)
viewer.CloseDocument(token);
CloseDocument entfernt die Sitzung aus dem Cache, gibt die zugrunde liegende Dokument‑Engine frei, löscht das secure-{token}‑Marker und widerruft die Zugriffsberechtigung. Die gleitende Ablaufzeit würde schließlich dasselbe tun, aber ein expliziter Abschluss garantiert, dass der Speicher sofort zurückgewonnen wird, sobald der Benutzer fertig ist.
6. Optional: Dokument auf dem Server konvertieren
Wenn Ihr Workflow einen PDF‑Export einer hochgeladenen Word‑Datei erfordert, aktivieren Sie das Converter‑Plugin in der Doconut‑Konfiguration (siehe Dokumentation). Nachdem das Plugin registriert ist, können Sie DocumentConverter injizieren und seine ConvertAsync‑Methode aufrufen. Die Konvertierung läuft auf dem Server, sodass Sie Office nie auf dem Web‑Server installieren müssen.
7. Skalierungsüberlegungen für Unternehmens‑Dokumentenverwaltung
- Stateless‑Front‑Ends – Das Viewer‑Widget speichert niemals Dokumentdaten; alle rechenintensiven Vorgänge bleiben auf dem Server.
- Verteilter Cache – Ersetzen Sie den standardmäßigen In‑Memory‑Cache durch einen verteilten Anbieter (Redis, NCache), wenn Sie mehrere Web‑Farm‑Knoten betreiben. Die Token‑zu‑Sitzungs‑Zuordnung funktioniert unverändert, da die Middleware aus dem konfigurierten
IMemoryCacheliest. - Background‑Jobs – Sie können Dokumente in einem Hintergrund‑Worker vorab öffnen, das Token im Cache speichern und später an die UI übergeben. Denken Sie daran, dass jedes Token pro Sitzung nur einmal verwendet werden kann; eine Wiederverwendung erfordert einen frischen
OpenDocumentAsync‑Aufruf.
Diese Muster ermöglichen es Ihnen, eine Dokumentenverwaltung‑Plattform zu erstellen, die von einem Single‑Server‑Intranet‑Portal bis zu einem Multi‑Region‑Cloud‑Service skaliert, ohne die Viewer‑Logik neu zu schreiben.
8. Schnelle Checkliste für eine produktionsreife Implementierung
| Schritt | Aktion |
|---|---|
| 1 | Registrieren Sie Doconut‑Dienste in Program.cs (Lizenz prüfen). |
| 2 | Fügen Sie Doconut‑Middleware auf einem dedizierten Zweig hinzu. |
| 3 | Stellen Sie einen /api/open‑Endpunkt bereit, der OpenDocumentAsync aufruft. |
| 4 | Übergeben Sie das zurückgegebene Token an objViewer.View(token) im Client. |
| 5 | Rufen Sie CloseDocument(token) auf, wenn der Viewer ausgeblendet wird oder die Seite entladen wird. |
| 6 | (Optional) Aktivieren Sie ConverterPlugin, wenn Sie eine serverseitige Konvertierung benötigen. |
| 7 | (Optional) Ersetzen Sie IMemoryCache durch einen verteilten Cache für horizontales Skalieren. |
Befolgen Sie die Liste, und Sie haben einen vollständigen, sicheren, leistungsstarken Dokumentenverwaltung‑Flow, der auf Doconut’s nativen .NET‑Viewer aufbaut.