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ån DoconutHost.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.DocImageHandler som deklarerats i Web.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:

csharp
// 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

  1. Licensgrind. En avvisad licens (manipulerad, svartlistad eller en build utanför licensens uppdateringsfönster) kastar omedelbart LicenseException med orsaken som meddelande. Öppning degraderas aldrig tyst för en ogiltig licens; en saknad licens ger bara vattenstämplar.
  2. 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.TimeOut minuter (standard 60). Varje sidförfrågan återställer timern.
  3. Åtkomstbeviljning. Med UnsafeMode = false (standard) bindas token till ASP.NET‑sessionen för den förfrågan som öppnade den: en secure-{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.
  4. 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ågaSyfte
?token=…&page=NRenderad sidbild (PNG)
?token=…&page=N&thumb=1Miniatyr
?token=…&zoom=…Zoomad sidrendering
?token=…&search=termFulltextsökning (licensstyrd)
?token=…&bookmarksDokumentöversikt och bokmärken
?token=…&copy / &showlinks / &fileFormat / &metaTextkopiering, hyperlänkar, formatinformation, DICOM‑metadata
?token=…&action=rotate/flip/closeSidåtgärder och explicit stäng (POST)
?token=…&AnnSave=… / &AnnLoadSpara och ladda annotationer

Varje förfrågan kontrolleras först:

  • Ingen token → 404, eller en versionsbanner när ShowDoconutInfo = 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

csharp
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.TimeOut kräver en ny öppning.
  • Viewer kan hämtas och delas fritt; sessionerna bär all state.

Var den här sidan hjälpsam?