Bygg en säker dokumenthanteringsvisare i .NET med Doconut
← Back to Blog••4 min read

Bygg en säker dokumenthanteringsvisare i .NET med Doconut

Implementering av dokumenthantering med Doconut

Ett dokumenthantering arbetsflöde i en .NET-portal behöver vanligtvis tre saker:

  1. Ett sätt att läsa in PDF‑filer, Office‑filer, CAD‑ritningar eller bilder utan att skriva en visare från grunden.
  2. En säker token som knyter det inlästa dokumentet till den aktuella webbläsarsessionen.
  3. Ett rensningssteg som frigör minnet så snart användaren är klar.

Doconut tillhandahåller alla tre genom en enda Viewer‑tjänst, en lättviktig IMemoryCache‑session och explicita CloseDocument‑anrop.


1. Registrera visaren i DI‑behållaren

Under applikationens uppstart, lägg till Doconut‑tjänster i DI‑behållaren genom att anropa Doconut‑registreringsmetoden som beskrivs i den officiella dokumentationen. Detta steg registrerar visaren, licenshantering och den minnes‑cache som kommer att hålla dokumentsessioner.

Registreringen validerar licensen vid uppstart, så varje saknad eller ogiltig licens misslyckas omedelbart och du får veta problemet innan den första begäran når servern.


2. Infoga middleware som serverar sidbilder, miniatyrer och annoteringsdata

Konfigurera Doconut‑middleware i begäran‑pipeline så att varje begäran som innehåller en ?token=‑frågesträng hanteras av Doconut. Middleware verkställer den förvalda säkerhetsmarkören (secure-{token}) när UnsafeMode är falskt (standard) och levererar sidbilder, miniatyrer och annoteringsdata.

Att placera middleware på en dedikerad gren håller resten av din pipeline orörd och möjliggör horisontell skalning utan sticky‑sessioner.


3. Öppna ett dokument och hämta den opaka sessions‑tokenen

Skapa en enda endpoint som tar emot en filsökväg (eller en ström) och returnerar tokenen. Tokenen är den enda legitimationen som klient‑widgeten någonsin ser.

app.MapPost("/api/open", async (Viewer viewer) =>
{
    // Token är ogenomskinlig — ge den till widgeten, logga eller spara den aldrig.
    string token = await viewer.OpenDocumentAsync("wwwroot/files/Contract.pdf");
    return Results.Ok(new { token });
});

Vad händer inuti OpenDocumentAsync

  1. Licensgrind – en ogiltig licens kastar LicenseException omedelbart.
  2. Sessionskapande – Doconut väljer rätt formatvisare (PDF, Word, DWG, …) och lagrar motorn i IMemoryCache under en GUID‑token.
  3. Säkerhetsregistrering – med UnsafeMode = false bindas tokenen till anroparens ASP.NET‑session via en secure-{token}‑markör. Endast den webbläsarsessionen kan begära sidor.
  4. Token‑återlämning – klienten får tokenen och använder den för varje efterföljande begäran (/DocImage.axd?token=…).

Den förvalda glidande utgångstiden är 60 minuter (konfigurerbar via DocOptions.TimeOut). Varje sidbegäran återställer klockan, så inaktiva sessioner försvinner automatiskt.


4. Rendera dokumentet på klientsidan

Från webbläsaren anropar du endpointen, hämtar tokenen och överlämnar den till Doconut‑widgeten:

fetch('/api/open', { method: 'POST' })
    .then(r => r.json())
    .then(d => {
        const token = d.token;
        objViewer.View(token);   // JavaScript widget levererad av Doconut
    });

Widgeten utfärdar internt sid‑, miniatyr‑, sök‑ och annoteringsbegäran som alla inkluderar samma token. Eftersom tokenen är knuten till server‑sidans session kan en illasinnad användare inte kapa en annan användares dokument.


5. Stäng dokumentet så snart användaren lämnar visaren

För stora PDF‑ eller CAD‑filer bör du frigöra renderingsmotorn omedelbart. Anropa CloseDocument från en server‑sidans endpoint eller från widgetens “unload”-händelse.

// Server‑side slutpunkt
app.MapPost("/api/close", (Viewer viewer, string token) =>
{
    viewer.CloseDocument(token);
    return Results.Ok();
});
// Direkt anrop från widgeten (om du exponerar token till backend)
viewer.CloseDocument(token);

CloseDocument tar bort sessionen från cachen, avyttrar den underliggande dokumentmotorn, raderar secure-{token}‑markören och återkallar åtkomstbehörigheten. Glidande utgång skulle så småningom göra samma sak, men en explicit stängning garanterar att minnet återtas omedelbart när användaren är klar.


6. Valfritt: Konvertera ett dokument på servern

Om ditt arbetsflöde kräver en PDF‑export av en uppladdad Word‑fil, aktivera Converter‑pluginet i Doconut‑konfigurationen (se dokumentationen). Efter att pluginet är registrerat kan du injicera DocumentConverter och anropa dess ConvertAsync‑metod. Konverteringen körs på servern, så du behöver aldrig ha Office installerat på webbservern.


7. Skalningsaspekter för företagsklassad dokumenthantering

  • Stateless front‑ends – Widgeten håller aldrig dokumentdata; all tung bearbetning sker på servern.
  • Distribuerad cache – Ersätt den förvalda minnes‑cachen med en distribuerad leverantör (Redis, NCache) om du kör flera webb‑farm‑noder. Token‑till‑session‑mappningen fungerar oförändrad eftersom middleware läser från den konfigurerade IMemoryCache.
  • Bakgrundsjobb – Du kan för‑öppna dokument i en bakgrundsarbetsprocess, cacha tokenen och överlämna den till UI:t senare. Kom bara ihåg att varje token är engångsbruk per session; återanvändning kräver ett nytt OpenDocumentAsync‑anrop.

Dessa mönster låter dig bygga en dokumenthantering‑plattform som skalar från en enkels‑server intranät‑portal till en multi‑region molntjänst utan att skriva om visarlogiken.


8. Snabbchecklista för en produktionsklar implementering

StegÅtgärd
1Registrera Doconut‑tjänster i Program.cs (validera licens).
2Lägg till Doconut‑middleware på en dedikerad gren.
3Exponera en /api/open‑endpoint som anropar OpenDocumentAsync.
4Skicka den returnerade tokenen till objViewer.View(token) i klienten.
5Anropa CloseDocument(token) när visaren är dold eller sidan laddas ur.
6(Valfritt) Aktivera ConverterPlugin om du behöver server‑sidokonvertering.
7(Valfritt) Byt ut IMemoryCache mot en distribuerad cache för horisontell skalning.

Följ listan så har du ett komplett, säkert, högpresterande dokumenthantering‑flöde byggt på Doconut’s inbyggda .NET‑visare.

#document management#.NET#document viewer#Doconut#secure rendering#dokumenthantering#dokumentvisare#säker rendering