Hur visaren fungerar
Dokumentförfrågningens livscykel
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‑sidobjekt 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‑förfrågan dokumenttillstånd, och implementerar medvetet inte IDisposable. Sessioner lever oberoende i sessionhanteraren och rensas upp av cacheutgång eller en explicit CloseDocument(token).
Du konstruerar den inte längre. AddDoconut() registrerar den som en transient tjänst; 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");
});I en MVC‑applikation, ta den som en konstruktörsparameter; i en Razor‑vy, använd @inject Doconut.Viewer Viewer. Applikationsägda cachar av Viewer‑instanser behövs inte längre — och är inte längre korrekta, eftersom de inte innehåller något som är värt att cacha.
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
LicenseException, med avvisningsorsaken som meddelande — öppning degraderas aldrig tyst för en ogiltig (till skillnad från frånvarande) licens. En kalender‑utgången tillfällig 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 timern. - 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.
Det finns inget separat uppvärmningssteg. Det tidigare biblioteket exponerade InitCache() för det ändamålet; det finns inte längre, och inget ersätter det.
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å förfrågan:
| Fråga | Syfte |
|---|---|
?token=…&page=N | Renderad sidbild (PNG) |
?token=…&page=N&thumb=1 | Miniatyrbild |
?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 i detta paket |
?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 → 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 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.
Var mellanprogrammet monteras
UseDoconut() svarar på förfrågningar som bär en token, var du än monterar det. Referensapplikationen behåller den historiska DocImage.axd‑förfrågningsformen på en MapWhen‑gren, så en befintlig klient fortsätter anropa den URL den alltid gjort. Oavsett vad du väljer, måste klientens BasePath stämma överens med den — se ViewerConfig.
Att leverera sidor från delad lagring istället för öppningsnoden är en helt annan arrangemang; se Distributed Deployments.
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.
Den anropas på den injicerade Viewer. Det tidigare mönstret — att konstruera en kortlivad Viewer i ett using‑block enbart för att stänga en token — har ingen motsvarighet och är inte behövt.
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.TimeOutbehöver öppnas på nytt. Viewerkan injiceras och delas fritt; sessioner bär all state.
Var den här sidan hjälpsam?