Jak funguje prohlížeč
Životní cyklus požadavků na dokument
Doconut vykresluje dokumenty jako stránkované obrázky poskytované prostřednictvím middleware ASP.NET Core. Porozumění životnímu cyklu — otevření, token, požadavky na stránky, uzavření — vysvětluje téměř veškeré chování, které můžete pozorovat, včetně chybových zpráv.
Tři pohyblivé části
Viewer— veřejná služba, kterou injektujete. Otevírá dokumenty a vrací tokeny relace.- Relace dokumentu — objekt na straně serveru, který drží načtený dokument, klíčovaný tokenem v
IMemoryCache. - Middleware Doconut — přidáno pomocí
UseDoconut(); odpovídá na každý požadavek, který widget prohlížeče provádí (pages,thumbnails,search,annotations, …), vždy ověřeno tokenem.
Viewer je bezstavový — záměrně
Viewer je uzavřený, neuchovává žádný stav dokumentu na požadavek a úmyslně neimplementuje IDisposable. Relace žijí nezávisle ve správci relací a jsou vyčištěny vypršením platnosti cache nebo explicitním CloseDocument(token).
Injektujte to kdekoliv potřebujete:
app.MapPost("/api/open", async (string fileName, Viewer viewer) =>
{
var token = await viewer.OpenDocumentAsync($"files/{fileName}");
return Results.Content(token, "text/plain");
});Co se děje uvnitř OpenDocumentAsync
- License gate. Odmítnutá nebo prošlá licence (na černé listině, poškozená nebo sestavení mimo aktualizační okno licence) okamžitě vyhodí
LicenseException, s důvodem odmítnutí jako zprávou — otevření se nikdy tiše nepropadá pro neplatnou (na rozdíl od chybějící) licenci. Licence s kalendářním vypršením (dočasná nebo předplatitelská) je výjimkou: nevyhazuje výjimku — přechází na vodoznak. - Session creation. Továrna prohlížeče vybere správný prohlížeč formátu podle přípony souboru a načte dokument (viz Rendering Pipeline). Relace je uložena v
IMemoryCachepod čerstvým GUID tokenem s posuvnou expirací —DocOptions.TimeOutminut, výchozí 60. Každý požadavek na stránku resetuje časovač. - Security registration. S
UnsafeMode = false(výchozí) je token svázán se session ASP.NET volajícího: do session je zapsán markersecure-{token}, takže pouze prohlížečová session, která dokument otevřela, může požadovat jeho stránky. - Token je vrácen. Je to jediné pověření pro vše, co následuje.
Tři přetížení se liší pouze vstupem: cesta k souboru, cesta k souboru plus konfigurace pro každý formát (PdfConfig, WordConfig, …), nebo Stream plus FileInfo, jehož přípona určuje detekci formátu.
Jak widget získává stránky
Klientský widget volá middleware Doconut s tokenem v řetězci dotazu. To, co middleware provede, závisí na požadavku:
| Query | Účel |
|---|---|
?token=…&page=N | Vykreslený obrázek stránky (PNG) |
?token=…&page=N&thumb=1 | Náhled |
?token=…&zoom=… | Zvětšené vykreslení stránky |
?token=…&search=term | Fulltextové vyhledávání (licencí řízené) |
?token=…&bookmarks | Osnova dokumentu/záložky |
?token=…© / &showlinks / &fileFormat | Kopírování textu, hypertextové odkazy a informace o formátu |
?token=…&meta | Technická metadata DICOM; vrací 501 pro DICOM relaci na .NET 6 |
?token=…&action=rotate/flip/close | Akce stránky a explicitní uzavření |
?token=…&AnnSave=… / &AnnLoad | Ukládání/načítání anotací |
Každá z těchto cest je nejprve ověřena:
- No token → middleware vrátí 404 (nebo banner verze, když
ShowDoconutInfo = true). - Unknown or expired token → chybový obrázek s
Document session not found. Please re-open document. - Session middleware missing (s
UnsafeMode = false) → HTTP 500 sSession middleware not configured. Call UseSession() before UseDoconut(). - Token opened by a different browser session → chybový obrázek s
You Are Not Authorized To View This Page.
Uzavření dokumentu
viewer.CloseDocument(token);CloseDocument odstraňuje relaci z cache (což uvolní podkladový dokumentový engine a okamžitě uvolní jeho paměť), maže marker secure-{token} a odvolává přístupové oprávnění. Volání je volitelné — posuvná expirace provádí stejný úklid automaticky — ale u velkých dokumentů je to zdvořilý způsob, jak uvolnit paměť, jakmile uživatel skončí.
Závěry
- Jeden otevřený dokument = jedna relace = jeden token. Tokeny jsou vázány na prohlížečovou relaci, ne na globální URL.
- Token vyprší v posuvném okně; prohlížeč ponechaný nečinný po
DocOptions.TimeOutpotřebuje opětovné otevření. Viewermůže být injektováno a volně sdíleno; relace nesou celý stav.
Byla tato stránka užitečná?