Hur visaren fungerar

Dokumentförfrågningslivscykeln

Doconut renderar dokument som paginerade bilder som levereras via ASP.NET Core-mellanprogram. Att förstå livscykeln — öppna, token, sidförfrågningar, stäng — förklarar nästan allt beteende du kommer att observera, inklusive felmeddelandena.

De tre rörliga delarna

  • Viewer — den offentliga tjänsten du injicerar. Den öppnar dokument och returnerar sessionstoken.
  • Dokumentsessionen — ett server‑sidigt objekt som håller det laddade dokumentet, nycklat med en token i IMemoryCache.
  • Doconut‑mellanprogrammet — tillagt av UseDoconut(); svarar på varje begäran som webbläsarwidgeten gör (pages, thumbnails, search, annotations, …), alltid autentiserat med token.

Viewer är tillståndslös — av design

Viewer är förseglad, har ingen per‑begäran dokumentstatus, och implementerar medvetet inte IDisposable. Sessioner lever oberoende i sessionshanteraren och rensas upp av cacheutgång eller en explicit CloseDocument(token).

Injicera den där du behöver den:

csharp
app.MapPost("/api/open", async (string fileName, Viewer viewer) =>
{
    var token = await viewer.OpenDocumentAsync($"files/{fileName}");
    return Results.Content(token, "text/plain");
});

Vad som händer inuti OpenDocumentAsync

  1. Licensgrind. En avvisad eller version‑utgången licens (svartlistad, manipulerad eller en build utanför licensens uppdateringsfönster) kastar omedelbart ett LicenseException, med avvisningsorsaken som meddelande — öppning degraderas aldrig tyst för en ogiltig (till skillnad från frånvarande) licens. En kalender‑utgången temporär eller prenumerationslicens är undantaget: den kastar inte — den degraderas till ett vattenstämpel.
  2. Sessionsskapande. Visarfabriken väljer rätt formatvisare för filändelsen och laddar dokumentet (se Rendering Pipeline). Sessionen lagras i IMemoryCache under en ny GUID‑token med en glidande utgångDocOptions.TimeOut minuter, standard 60. Varje sidförfrågan återställer timern.
  3. Säkerhetsregistrering. Med UnsafeMode = false (standard) bindas token till anroparens ASP.NET‑session: en secure-{token}‑markör skrivs in i sessionen, så endast den webbläsarsession som öppnade dokumentet kan begära dess sidor.
  4. Token returneras. Den är den enda referensen för allt som följer.

De tre överlagringarna skiljer sig endast i indata: en filsökväg, en filsökväg plus en per‑format‑konfiguration (PdfConfig, WordConfig, …), eller en Stream plus en FileInfo vars filändelse styr formatdetektering.

Hur widgeten får sidor

Klientwidgeten anropar Doconut‑mellanprogrammet med token i frågesträngen. Vad mellanprogrammet gör beror på begäran:

FrågaSyfte
?token=…&page=NRenderad sidbild (PNG)
?token=…&page=N&thumb=1Miniatyr
?token=…&zoom=…Zoomad sidrendering
?token=…&search=termFulltextsökning (licensstyrd)
?token=…&bookmarksDokumentöversikt/bokmärken
?token=…&copy / &showlinks / &fileFormat / &metaTextkopiering, hyperlänkar, formatinfo, DICOM teknisk metadata
?token=…&action=rotate/flip/closeSidåtgärder och explicit stängning
?token=…&AnnSave=… / &AnnLoadSpara/ladda annotationer

Var och en av dessa vägar valideras först:

  • Ingen token → mellanprogrammet returnerar 404 (eller en versionsbanner när ShowDoconutInfo = true).
  • Okänd eller utgången token → en felbild med Document session not found. Please re-open document.
  • Session‑mellanprogram saknas (med UnsafeMode = false) → HTTP 500 med Session middleware not configured. Call UseSession() before UseDoconut().
  • Token öppnad av en annan webbläsarsession → en felbild med You Are Not Authorized To View This Page.

Stänga ett dokument

csharp
viewer.CloseDocument(token);

CloseDocument tar bort sessionen från cachen (vilket avyttrar den underliggande dokumentmotorn och frigör dess minne omedelbart), raderar secure-{token}‑markören och återkallar åtkomstbehörigheten. Att anropa den är valfritt — glidande utgång gör samma rensning automatiskt — men för stora dokument är det det artiga sättet att frigöra minne så snart användaren är klar.

Slutsatser

  • Ett öppet dokument = en session = en token. Token är per webbläsarsession, inte globala URL:er.
  • Tokenen går ut på ett glidande fönster; en visare som lämnas inaktiv längre än DocOptions.TimeOut behöver öppnas på nytt.
  • Viewer kan injiceras och delas fritt; sessioner bär all state.

Var den här sidan till hjälp?