Cara Kerja Viewer
Siklus Hidup Permintaan Dokumen
Doconut merender dokumen sebagai gambar berhalaman yang disajikan melalui middleware ASP.NET Core. Memahami siklus hidup — buka, token, permintaan halaman, tutup — menjelaskan hampir semua perilaku yang akan Anda amati, termasuk pesan kesalahan.
Tiga Komponen yang Bergerak
Viewer— layanan publik yang Anda injeksikan. Ia membuka dokumen dan mengembalikan token sesi.- Sesi dokumen — objek sisi server yang menyimpan dokumen yang dimuat, diindeks dengan token di
IMemoryCache. - Middleware Doconut — ditambahkan oleh
UseDoconut(); menjawab setiap permintaan yang dibuat widget browser (pages,thumbnails,search,annotations, …), selalu diautentikasi oleh token.
Viewer tidak menyimpan status — secara desain
Viewer bersifat sealed, tidak menyimpan status dokumen per permintaan, dan dengan sengaja tidak mengimplementasikan IDisposable. Sesi hidup secara independen di manajer sesi dan dibersihkan oleh kedaluwarsa cache atau dengan CloseDocument(token) secara eksplisit.
Injeksi di mana pun Anda membutuhkannya:
app.MapPost("/api/open", async (string fileName, Viewer viewer) =>
{
var token = await viewer.OpenDocumentAsync($"files/{fileName}");
return Results.Content(token, "text/plain");
});Apa yang terjadi di dalam OpenDocumentAsync
- Gerbang lisensi. Lisensi yang ditolak atau kedaluwarsa versi (terdaftar hitam, dimanipulasi, atau build di luar jendela pembaruan lisensi) langsung melempar
LicenseException, dengan alasan penolakan sebagai pesan — pembukaan tidak pernah secara diam-diam menurun untuk lisensi yang tidak valid (berlawanan dengan lisensi yang tidak ada). Lisensi Sementara atau berlangganan yang kedaluwarsa kalender adalah pengecualian: tidak melempar — menurunkan menjadi watermark. - Pembuatan sesi. Factory viewer memilih viewer format yang tepat untuk ekstensi file dan memuat dokumen (lihat Rendering Pipeline). Sesi disimpan di
IMemoryCachedengan token GUID baru dan kedaluwarsa bergulir —DocOptions.TimeOutmenit, default 60. Setiap permintaan halaman mengatur ulang timer. - Registrasi keamanan. Dengan
UnsafeMode = false(default), token diikat ke sesi ASP.NET pemanggil: penandasecure-{token}ditulis ke dalam sesi, sehingga hanya sesi browser yang membuka dokumen yang dapat meminta halamannya. - Token dikembalikan. Itu menjadi kredensial tunggal untuk semua yang berikutnya.
Tiga overload hanya berbeda pada input: jalur file, jalur file plus konfigurasi per-format (PdfConfig, WordConfig, …), atau Stream plus FileInfo yang ekstensi filenya menentukan deteksi format.
Bagaimana widget mendapatkan halaman
Widget klien memanggil middleware Doconut dengan token di string kueri. Apa yang dilakukan middleware tergantung pada permintaan:
| Kueri | Tujuan |
|---|---|
?token=…&page=N | Gambar halaman yang dirender (PNG) |
?token=…&page=N&thumb=1 | Thumbnail |
?token=…&zoom=… | Render halaman dengan zoom |
?token=…&search=term | Pencarian teks penuh (terbatas lisensi) |
?token=…&bookmarks | Garis besar dokumen/bookmark |
?token=…© / &showlinks / &fileFormat | Penyalinan teks, tautan, dan info format |
?token=…&meta | Metadata teknis DICOM; mengembalikan 501 untuk sesi DICOM pada .NET 6 |
?token=…&action=rotate/flip/close | Aksi halaman dan penutupan eksplisit |
?token=…&AnnSave=… / &AnnLoad | Simpan/muat anotasi |
Setiap jalur ini divalidasi terlebih dahulu:
- Tidak ada token → middleware mengembalikan 404 (atau banner versi ketika
ShowDoconutInfo = true). - Token tidak dikenal atau kedaluwarsa → gambar error dengan
Document session not found. Please re-open document. - Middleware sesi tidak ada (dengan
UnsafeMode = false) → HTTP 500 denganSession middleware not configured. Call UseSession() before UseDoconut(). - Token dibuka oleh sesi browser yang berbeda → gambar error dengan
You Are Not Authorized To View This Page.
Menutup dokumen
viewer.CloseDocument(token);CloseDocument menghapus sesi dari cache (yang membuang mesin dokumen yang mendasarinya dan membebaskan memorinya secara langsung), menghapus penanda secure-{token}, dan mencabut hak akses. Memanggilnya bersifat opsional — kedaluwarsa bergulir melakukan pembersihan yang sama secara otomatis — tetapi untuk dokumen besar ini adalah cara yang sopan untuk melepaskan memori segera setelah pengguna selesai.
Poin Penting
- Satu dokumen terbuka = satu sesi = satu token. Token bersifat per sesi browser, bukan URL global.
- Token kedaluwarsa pada jendela bergulir; viewer yang dibiarkan menganggur melewati
DocOptions.TimeOutmembutuhkan pembukaan ulang. Viewerdapat diinjeksikan dan dibagikan secara bebas; sesi membawa semua status.
Apakah halaman ini membantu?