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 z DoconutHost.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.DocImageHandler deklarovaný v Web.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:

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");
}

Co se děje uvnitř OpenDocumentAsync

  1. Licenční brána. Odmítnutá licence (poškozená, na černé listině nebo sestavená mimo časové okno licence) okamžitě vyhodí LicenseException s 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.
  2. 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.TimeOut minutách (výchozí 60). Každý požadavek na stránku resetuje časovač.
  3. 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žka secure-{token}. Otevření tedy musí proběhnout v požadavku s aktivovaným stavem relace — viz Sezení a zabezpečení.
  4. 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=NVykreslený obrázek stránky (PNG)
?token=…&page=N&thumb=1Náhled
?token=…&zoom=…Přiblížené vykreslení stránky
?token=…&search=termFulltextové vyhledávání (licencované)
?token=…&bookmarksOsnova dokumentu a záložky
?token=…&copy / &showlinks / &fileFormat / &metaKopírování textu, hypertextové odkazy, informace o formátu, DICOM metadata
?token=…&action=rotate/flip/closeAkce na stránce a explicitní uzavření (POST)
?token=…&AnnSave=… / &AnnLoadUložení a načtení anotací

Každý požadavek je nejprve ověřen:

  • Žádný token → 404, nebo banner verze, pokud je ShowDoconutInfo = 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

csharp
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.TimeOut vyžaduje opětovné otevření.
  • Viewer lze libovolně získat a sdílet; relace nesou veškerý stav.

Byla tato stránka užitečná?