Hur visaren fungerar
Dokumentförfrågningslivscykeln
Doconut renderar dokument som paginerade bilder som levereras via ASP.NET Core-mellankod. 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‑sidobjekt som håller det laddade dokumentet, nycklat med en token i
IMemoryCache. - Doconut‑mellankoden — tillagd av
UseDoconut(); svarar på varje begäran som webbläsarwidgeten gör (pages,thumbnails,search,annotations, …), alltid autentiserad med token.
Viewer är tillståndslös — avsiktligt
Viewer är förseglad, håller ingen per‑förfrågan 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:
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 i OpenDocumentAsync
- Licensgrind. En avvisad eller version‑utgången licens (svartlistad, manipulerad eller en build utanför licensens uppdateringsfönster) kastar omedelbart ett
LicenseExceptionmed 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. - Sessionskapande. Visarfabriken väljer rätt formatvisare för filändelsen och laddar dokumentet (se Rendering Pipeline). Sessionen lagras i
IMemoryCacheunder en ny GUID‑token med en glidande utgång —DocOptions.TimeOutminuter, standard 60. Varje sidförfrågan återställer klockan. - Säkerhetsregistrering. Med
UnsafeMode = false(standard) bindas token till anroparens ASP.NET‑session: ensecure-{token}‑markör skrivs in i sessionen, så att endast den webbläsarsession som öppnade dokumentet kan begära dess sidor. - Token returneras. Den är den enda autentiseringsuppgiften för allt som följer.
De tre överlagringarna skiljer sig bara i indata: en filsökväg, en filsökväg plus en per‑formatkonfiguration (PdfConfig, WordConfig, …), eller en Stream plus en FileInfo vars filändelse styr formatdetektering.
Hur widgeten hämtar sidor
Klientwidgeten anropar Doconut‑mellankoden med token i frågesträngen. Vad mellankoden gör beror på begäran:
| Fråga | Syfte |
|---|---|
?token=…&page=N | Renderad sidbild (PNG) |
?token=…&page=N&thumb=1 | Miniatyr |
?token=…&zoom=… | Zoomad sidrendering |
?token=…&search=term | Fulltextsökning (licensstyrd) |
?token=…&bookmarks | Dokumentöversikt/bokmärken |
?token=…© / &showlinks / &fileFormat | Textkopiering, hyperlänkar och formatinformation |
?token=…&meta | DICOM teknisk metadata; returnerar 501 för en DICOM‑session på .NET 6 |
?token=…&action=rotate/flip/close | Sidåtgärder och explicit stängning |
?token=…&AnnSave=… / &AnnLoad | Spara/ladda annotationer |
Var och en av dessa vägar valideras först:
- Ingen token → mellankoden 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‑mellankod saknas (med
UnsafeMode = false) → HTTP 500 medSession 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
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 städning 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.TimeOutkräver en ny öppning. Viewerkan injiceras och delas fritt; sessioner bär all status.
Var den här sidan till hjälp?