Jak funguje prohlížeč
Životní cyklus požadavků na dokument
Doconut vykresluje dokumenty jako stránkované obrázky, které poskytuje HTTP handler registrovaný ve vašem Web.config. 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.
Pohyblivé části
Viewer— veřejná služba, kterou získáte zDoconutHost.Services. Otevírá dokumenty a vrací tokeny relace.- Relace dokumentu — objekt na straně serveru, který drží načtený dokument v paměti pod svým tokenem.
DocImage.axd—Doconut.DocImageHandlerdeklarovaný vWeb.config. Odpovídá na každý požadavek, který widget prohlížeče provede (stránky, náhledy, hledání, anotace, …), vždy identifikovaný tokenem./doconut-res/*—Doconut.DoconutResourceModule, který poskytuje vlastní skripty, styly a ikony widgetu.
Viewer je bezstavý — záměrně
Viewer neukládá žádný stav dokumentu na úrovni požadavku a neimplementuje IDisposable. Relace existují nezávisle na něm a jsou vyčištěny vypršením platnosti nebo explicitním voláním CloseDocument(token). System.Web nemá konstruktorovou injekci, takže jej získáte tam, kde jej potřebujete — typicky v akci kontroleru:
// 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");
}Co se děje uvnitř OpenDocumentAsync
- Licenční brána. Odmítnutá licence (poškozená, na černé listině nebo sestavená mimo časové okno licence) okamžitě vyhodí
LicenseExceptions důvodem jako zprávou. Otevírání se nikdy tiše nevrací do nižší kvality při neplatné licenci; chybějící licence pouze vodoznakuje. - Vytvoření relace. Továrna prohlížeče vybere prohlížeč formátu podle přípony souboru a načte dokument (viz Renderovací pipeline). Relace je uložena v paměti pod novým náhodným tokenem s klouzavým vypršením po
DocOptions.TimeOutminutách (výchozí 60). Každý požadavek na stránku resetuje časovač. - Udílení přístupu. Při
UnsafeMode = false(výchozí) je token svázán s ASP.NET relací požadavku, který jej otevřel: do této relace se zapíše položkasecure-{token}. Otevření tedy musí proběhnout v požadavku s aktivovaným stavem relace — viz Sezení a zabezpečení. - Token je vrácen. Je to jediný identifikátor, který prohlížeč potřebuje pro vše, co následuje.
Asynchronní přetížení přijímají cestu k souboru, cestu k souboru plus konfiguraci pro konkrétní formát (PdfConfig, WordConfig, …) nebo Stream plus FileInfo, jehož přípona určuje formát. Pro kód-behind ve Web Forms, který nepoužívá asynchronní stránky, OpenDocument nabízí stejný trojice vstupů synchronně (cestu, stream s názvem souboru nebo pole bajtů s názvem souboru).
Jak widget získává stránky
Widget volá DocImage.axd s tokenem v řetězci dotazu. Co handler udělá, závisí na požadavku:
| Dotaz | Účel |
|---|---|
?token=…&page=N | Vykreslený obrázek stránky (PNG) |
?token=…&page=N&thumb=1 | Náhled |
?token=…&zoom=… | Přiblížené vykreslení stránky |
?token=…&search=term | Fulltextové vyhledávání (licencované) |
?token=…&bookmarks | Osnova dokumentu a záložky |
?token=…© / &showlinks / &fileFormat / &meta | Kopírování textu, hypertextové odkazy, informace o formátu, DICOM metadata |
?token=…&action=rotate/flip/close | Akce na stránce a explicitní uzavření (POST) |
?token=…&AnnSave=… / &AnnLoad | Uložení a načtení anotací |
Každý požadavek je nejprve ověřen:
- Žádný token →
404, nebo banner verze, pokud jeShowDoconutInfo = true. - Token nepřiřazen této ASP.NET relaci → chybový obrázek s textem
You Are Not Authorized To View This Page. - Neznámý nebo vypršený token → chybový obrázek s textem
Document session not found. Please re-open document.
Chybové obrázky jsou obyčejné PNG soubory odeslané se stavem 200, takže widget je může zobrazit tam, kde by byla stránka. Monitorovací kontrola, která sleduje jen stavový kód, je bude považovat za obsloužené stránky; skutečná stránka má desítky až stovky kilobajtů, chybový obrázek asi 2 KB.
Uzavření dokumentu
viewer.CloseDocument(token);CloseDocument odstraní relaci (okamžitě uvolní dokumentový engine a jeho paměť), smaže položku secure-{token} z aktuální ASP.NET relace požadavku a token zruší. Je to volitelné — klouzavé vypršení provádí stejný úklid — ale pro velké dokumenty uvolní paměť v okamžiku, kdy uživatel skončí. Z prohlížeče objViewer.Close(true) pošle ekvivalentní požadavek na uzavření do DocImage.axd.
Závěry
- Jeden otevřený dokument = jedna relace = jeden token, přidělený ASP.NET relaci, která jej otevřela.
- Token vyprší v klouzavém okně; prohlížeč ponechaný nečinný déle než
DocOptions.TimeOutvyžaduje opětovné otevření. Viewerlze libovolně získat a sdílet; relace nesou veškerý stav.
Byla tato stránka užitečná?