Hur Viewer fungerar
Dokumentförfrågningens livscykel
Doconut renderar dokument som paginerade bilder, som levereras av en HTTP‑handler som din Web.config registrerar. Att förstå livscykeln — öppna, token, sidförfrågningar, stäng — förklarar nästan allt beteende du kommer att observera, inklusive felmeddelandena.
De rörliga delarna
Viewer— den offentliga tjänsten du hämtar frånDoconutHost.Services. Den öppnar dokument och returnerar sessionstoken.- Dokumentsessionen — ett server‑sidobjekt som håller det laddade dokumentet, lagrat i minnet under dess token.
DocImage.axd—Doconut.DocImageHandlersom deklarerats iWeb.config. Den svarar på varje begäran som webbläsarwidgeten gör (sidor, miniatyrer, sök, annotationer, …), alltid identifierad av token./doconut-res/*—Doconut.DoconutResourceModule, som levererar widgetens egna skript, stilar och ikoner.
Viewer är tillståndslös — avsiktligt
Viewer har ingen per‑förfrågan dokumenttillstånd och implementerar inte IDisposable. Sessioner lever oberoende av den och rensas upp genom utgång eller en explicit CloseDocument(token). System.Web har ingen konstruktor‑injektion, så hämta den där du behöver den — vanligtvis i en controller‑action:
// POST /ViewerApi/Open?fileName=Sample.pdf
[HttpPost]
public async Task<ActionResult> Open(string fileName)
{
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
var path = Server.MapPath("~/files/" + Path.GetFileName(fileName));
var token = await viewer.OpenDocumentAsync(path);
return Content(token, "text/plain");
}Vad som händer i OpenDocumentAsync
- Licensgrind. En avvisad licens (manipulerad, svartlistad eller en build utanför licensens uppdateringsfönster) kastar omedelbart
LicenseExceptionmed orsaken som meddelande. Öppning degraderas aldrig tyst för en ogiltig licens; en saknad licens ger bara vattenstämplar. - Sessionskapande. Viewer‑fabriken väljer format‑viewer för filändelsen och laddar dokumentet (se Renderingspipeline). Sessionen lagras i minnet under en ny slumpmässig token med en glidande utgång på
DocOptions.TimeOutminuter (standard 60). Varje sidförfrågan återställer timern. - Åtkomstbeviljning. Med
UnsafeMode = false(standard) bindas token till ASP.NET‑sessionen för den förfrågan som öppnade den: ensecure-{token}‑post skrivs in i den sessionen. Öppningen måste därför köras i en förfrågan med sessionsstatus — se Sessioner & Säkerhet. - Token returneras. Det är den enda identifieraren som webbläsaren behöver för allt som följer.
De asynkrona överlagringarna tar en filsökväg, en filsökväg plus en per‑format‑konfiguration (PdfConfig, WordConfig, …), eller en Stream plus en FileInfo vars filändelse bestämmer formatet. För Web Forms‑code‑behind som inte använder asynkrona sidor erbjuder OpenDocument samma tre inmatningar synkront (en sökväg, en ström med ett filnamn eller en byte‑array med ett filnamn).
Hur widgeten hämtar sidor
Widgeten anropar DocImage.axd med token i frågesträngen. Vad handlern gör beror på förfrågan:
| 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 och bokmärken |
?token=…© / &showlinks / &fileFormat / &meta | Textkopiering, hyperlänkar, formatinformation, DICOM‑metadata |
?token=…&action=rotate/flip/close | Sidåtgärder och explicit stäng (POST) |
?token=…&AnnSave=… / &AnnLoad | Spara och ladda annotationer |
Varje förfrågan kontrolleras först:
- Ingen token →
404, eller en versionsbanner närShowDoconutInfo = true. - Token inte beviljad för denna ASP.NET‑session → en felbild med texten
You Are Not Authorized To View This Page. - Okänd eller utgången token → en felbild med texten
Document session not found. Please re-open document.
Felbilderna är vanliga PNG‑filer som skickas med status 200, så widgeten kan visa dem där sidan skulle vara. En övervakningskontroll som bara tittar på statuskoden rapporterar dem som levererade sidor; en riktig sida är tiotals till hundratals kilobyte, en felbild omkring 2 KB.
Stänga ett dokument
viewer.CloseDocument(token);CloseDocument tar bort sessionen (frisätter dokumentmotorn och dess minne omedelbart), tar bort secure-{token}‑posten från den aktuella förfrågningens ASP.NET‑session och återkallar token. Det är valfritt — glidande utgång gör samma städning — men för stora dokument frigör det minnet så snart användaren är klar. Från webbläsaren skickar objViewer.Close(true) motsvarande stängningsförfrågan till DocImage.axd.
Slutsatser
- Ett öppet dokument = en session = en token, beviljad till den ASP.NET‑session som öppnade det.
- Tokenen går ut på ett glidande fönster; en viewer som är inaktiv längre än
DocOptions.TimeOutkräver en ny öppning. Viewerkan hämtas och delas fritt; sessionerna bär all state.
Var den här sidan hjälpsam?