Як працює переглядач
Життєвий цикл запиту документа
Doconut рендерить документи у вигляді розбитих на сторінки зображень, які обслуговуються HTTP‑обробником, який реєструє ваш Web.config. Розуміння життєвого циклу — відкриття, токен, запити сторінок, закриття — пояснює майже всю поведінку, яку ви спостерігатимете, включаючи повідомлення про помилки.
Рухомі частини
Viewer— публічний сервіс, який ви отримуєте зDoconutHost.Services. Він відкриває документи та повертає токени сесії.- Сесія документа — об’єкт на боці сервера, що зберігає завантажений документ, утримується в пам’яті під його токеном.
DocImage.axd—Doconut.DocImageHandler, оголошений уWeb.config. Він відповідає на кожен запит, який робить віджет браузера (сторінки, мініатюри, пошук, анотації, …), завжди ідентифікований токеном./doconut-res/*—Doconut.DoconutResourceModule, який обслуговує власні скрипти, стилі та іконки віджета.
Viewer є безстанним — за задумом
Viewer не зберігає стан документа для кожного запиту і не реалізує IDisposable. Сесії існують незалежно від нього і очищуються за допомогою закінчення терміну або явного CloseDocument(token). System.Web не підтримує ін’єкцію через конструктор, тому отримуйте його там, де потрібен — зазвичай у дії контролера:
// 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");
}Що відбувається всередині OpenDocumentAsync
- Ліцензійна брана. Відхилена ліцензія (підроблена, у чорному списку або збірка поза вікном оновлення ліцензії) миттєво генерує
LicenseException, причиною чого є повідомлення. Відкриття ніколи не деградує без повідомлення для недійсної ліцензії; відсутня ліцензія лише додає водяний знак. - Створення сесії. Фабрика переглядача вибирає переглядач формату за розширенням файлу та завантажує документ (див. Конвеєр рендерингу). Сесія зберігається в пам’яті під новим випадковим токеном з ковзним терміном дії
DocOptions.TimeOutхвилин (за замовчуванням 60). Кожен запит сторінки скидає таймер. - Надання доступу. За допомогою
UnsafeMode = false(за замовчуванням) токен прив’язується до ASP.NET‑сесії запиту, який його відкрив: записsecure-{token}записується в цю сесію. Тому відкриття має виконуватись у запиті зі станом сесії — див. Сесії та безпека. - Токен повертається. Це єдиний ідентифікатор, який потрібен браузеру для всього подальшого.
Асинхронні перевантаження приймають шлях до файлу, шлях до файлу плюс конфігурацію для формату (PdfConfig, WordConfig, …) або Stream плюс FileInfo, розширення якого визначає формат. Для коду‑задника Web Forms, який не використовує асинхронні сторінки, OpenDocument пропонує ті ж три входи синхронно (шлях, потік з ім’ям файлу або масив байтів з ім’ям файлу).
Як віджет отримує сторінки
Віджет викликає DocImage.axd з токеном у рядку запиту. Те, що робить обробник, залежить від запиту:
| Запит | Призначення |
|---|---|
?token=…&page=N | Зображення відрендереної сторінки (PNG) |
?token=…&page=N&thumb=1 | Мініатюра |
?token=…&zoom=… | Збільшене відображення сторінки |
?token=…&search=term | Повнотекстовий пошук (з ліцензійним обмеженням) |
?token=…&bookmarks | Структура документа та закладки |
?token=…© / &showlinks / &fileFormat / &meta | Копіювання тексту, гіперпосилання, інформація про формат, метадані DICOM |
?token=…&action=rotate/flip/close | Дії зі сторінкою та явне закриття (POST) |
?token=…&AnnSave=… / &AnnLoad | Збереження та завантаження анотацій |
Кожен запит спочатку перевіряється:
- Відсутній токен →
404, або банер версії, колиShowDoconutInfo = true. - Токен не наданий цій ASP.NET‑сесії → зображення помилки з текстом
You Are Not Authorized To View This Page. - Невідомий або прострочений токен → зображення помилки з текстом
Document session not found. Please re-open document.
Зображення помилок — це звичайні PNG, які надсилаються зі статусом 200, щоб віджет міг показати їх там, де мала би бути сторінка. Перевірка моніторингу, яка дивиться лише на код статусу, буде вважати їх обслуговуваними сторінками; реальна сторінка важить десятки‑сотні кілобайт, а зображення помилки — близько 2 КБ.
Закриття документа
viewer.CloseDocument(token);CloseDocument видаляє сесію (одразу звільняючи движок документа та його пам’ять), видаляє запис secure-{token} з ASP.NET‑сесії поточного запиту та анулює токен. Це необов’язково — ковзний термін дії виконує таке ж очищення — але для великих документів це звільняє пам’ять одразу після завершення користувачем. З браузера objViewer.Close(true) надсилає еквівалентний запит на закриття до DocImage.axd.
Висновки
- Одне відкриття документа = одна сесія = один токен, наданий ASP.NET‑сесії, яка його відкрила.
- Токен закінчує термін дії у ковзному вікні; переглядач, що залишився без активності після
DocOptions.TimeOut, потребує повторного відкриття. Viewerможна отримати та вільно ділитися; сесії несуть весь стан.
Чи була ця сторінка корисною?