Erstellen Sie einen sicheren Dokumentenverwaltungs‑Viewer in .NET mit Doconut
← Back to Blog••5 min read

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:

  1. Eine Möglichkeit, PDFs, Office‑Dateien, CAD‑Zeichnungen oder Bilder zu laden, ohne einen Viewer von Grund auf neu zu schreiben.
  2. Ein sicheres Token, das das geladene Dokument mit der aktuellen Browsersitzung verknüpft.
  3. 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 Anmelde­merkmal, 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

  1. Lizenz‑Gate – eine ungültige Lizenz wirft LicenseException sofort.
  2. Sitzungserstellung – Doconut wählt den passenden Format‑Viewer (PDF, Word, DWG, …) und speichert die Engine in IMemoryCache unter einem GUID‑Token.
  3. Sicherheitsregistrierung – mit UnsafeMode = false wird das Token über einen secure-{token}‑Marker an die ASP.NET‑Sitzung des Aufrufers gebunden. Nur diese Browsersitzung kann Seiten anfordern.
  4. 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 IMemoryCache liest.
  • 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

SchrittAktion
1Registrieren Sie Doconut‑Dienste in Program.cs (Lizenz prüfen).
2Fügen Sie Doconut‑Middleware auf einem dedizierten Zweig hinzu.
3Stellen Sie einen /api/open‑Endpunkt bereit, der OpenDocumentAsync aufruft.
4Übergeben Sie das zurückgegebene Token an objViewer.View(token) im Client.
5Rufen 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.

#document management#.NET#document viewer#Doconut#secure rendering#Dokumentenverwaltung#Dokumenten‑Viewer#sichere Darstellung