Penampil Tanpa Status — Cara Membuat Endpoint Terbuka Minimal .NET 8
← Back to Blog••4 min read

Penampil Tanpa Status — Cara Membuat Endpoint Terbuka Minimal .NET 8

Penampil Tanpa Status — oleh Desain

Viewer tidak menyimpan data dokumen per‑permintaan. Itu adalah kelas tertutup, tidak pernah mengimplementasikan IDisposable, dan setiap dokumen yang Anda buka berada dalam sesi terpisah yang dikelola oleh cache kerangka kerja. Karena itu Anda dapat menyuntikkan satu instance Viewer di mana saja dalam aplikasi ASP.NET Core Anda dan memanggilnya dengan aman dari banyak permintaan bersamaan.


Konsekuensi layanan tanpa status

  • Tidak ada sumber daya tersembunyi – layanan itu sendiri tidak pernah mengalokasikan buffer besar yang memerlukan pembersihan eksplisit.
  • Thread‑safe secara default – karena tidak ada keadaan khusus permintaan yang disimpan, instance Viewer yang sama dapat digunakan oleh banyak thread tanpa penguncian.
  • Penerapan yang dapat diskalakan – penskalaan horizontal berfungsi langsung; Anda tidak memerlukan sesi lengket atau afinitas server, hanya token sesi yang dimiliki klien.

Semua informasi spesifik dokumen (halaman, anotasi, indeks pencarian) disimpan dalam sesi yang dibuat oleh OpenDocumentAsync. Sesi disimpan di IMemoryCache (atau di IDistributedCache apa pun yang Anda konfigurasikan) dan kedaluwarsa secara otomatis setelah periode tidak aktif (default 60 menit). Ketika selesai, Anda dapat memanggil CloseDocument untuk membebaskan entri cache lebih awal.

Mendaftarkan Penampil Tanpa Status

Karena Viewer tidak memiliki keadaan yang dapat diubah, daftarkan sekali selama proses startup:

builder.Services.AddDoconut();               // mendaftarkan Viewer dan middleware yang diperlukan
builder.Services.AddSession();               // diperlukan untuk keamanan token
builder.Services.AddDistributedMemoryCache(); // cache sederhana untuk demo

Pemanggilan AddDoconut juga menghubungkan middleware yang menyajikan sumber daya statis penampil. Setelah layanan tersedia, Anda dapat meminta Viewer dalam tanda tangan endpoint apa pun.

Endpoint buka‑dokumen minimal (contoh net‑8)

Kode berikut adalah potongan tepat dari dokumentasi resmi dan berfungsi langsung dalam proyek .NET 8 minimal‑API:

app.MapPost("/api/open", async (string fileName, Viewer viewer) =>
{
    var token = await viewer.OpenDocumentAsync($"files/{fileName}");
    return Results.Content(token, "text/plain");
});

Apa yang dilakukan kode

  1. Menerima nama file – klien memberi tahu server file mana di bawah wwwroot/files yang akan dibuka.
  2. Memanggil OpenDocumentAsync – Viewer tanpa status membuat sesi baru, menyimpannya di cache, dan mengembalikan token tidak transparan.
  3. Mengembalikan token sebagai teks biasa – klien menerima hanya token; server tidak pernah mengirimkan byte dokumen dalam respons ini.

Karena Viewer tidak menyimpan data dokumen, endpoint tidak memerlukan blok using, panggilan Dispose, atau pabrik per‑permintaan. Token adalah satu‑satunya kredensial yang akan pernah dikirim klien kembali ke widget penampil (objViewer.View(token) di front‑end).

Menggunakan token di sisi klien

Setelah token dikembalikan, widget front‑end memanggil objViewer.View(token). Widget kemudian menyertakan token yang sama pada setiap permintaan selanjutnya untuk gambar halaman, pencarian, atau aksi anotasi. Server memvalidasi token terhadap sesi yang awalnya membuka dokumen. Jika token disajikan dari sesi peramban yang berbeda, penampil mengembalikan kesalahan otorisasi, yang merupakan perilaku keamanan yang dimaksud.

Jika alur kerja Anda mengetahui bahwa dokumen tidak akan pernah diakses lagi, Anda dapat membebaskan entri cache dengan memanggil CloseDocument pada Viewer. Ini menghapus sesi dari cache dan mencegah timer kedaluwarsa bergulir menjaga sesi tetap hidup.

Ringkasan alur tanpa status

LangkahApa yang terjadiDi mana keadaan berada
Suntik PenampilSatu instance Viewer dibuat saat startup.Di kontainer DI (singleton).
OpenDocumentAsyncLisensi diperiksa → sesi dibuat → token dikembalikan.Sesi disimpan di IMemoryCache (atau cache terdistribusi).
Klien merenderWidget mengirim token dengan setiap permintaan.Token adalah satu‑satunya data per‑dokumen yang dimiliki klien.
Kedaluwarsa sesi / TutupDokumenEntri cache dihapus setelah batas waktu atau penutupan eksplisit.Tidak ada sumber daya yang tertinggal di layanan Penampil.

Karena layanan itu sendiri tidak pernah menyimpan data dokumen, Anda dapat dengan aman menskalakan web farm Anda, mengganti node, atau memulai ulang aplikasi tanpa kehilangan keadaan yang terlihat oleh pengguna—hanya token yang menjadi tidak valid, memaksa klien untuk membuka kembali dokumen.

Menyebarkan Penampil Tanpa Status dalam aplikasi Anda

  1. Tambahkan AddDoconut, AddSession, dan penyedia cache ke Program.cs.
  2. Tempelkan potongan kode open‑endpoint ke konfigurasi minimal‑API Anda.
  3. Kirim token yang dikembalikan ke objViewer.View(token) di front‑end.

Anda kini memiliki API buka‑dokumen yang sepenuhnya tanpa status, siap produksi, yang memanfaatkan desain Viewer Doconut.

#dotnet8#viewer#stateless#api#doconut#penampil#tanpa status