Cách hoạt động của Viewer

Vòng đời yêu cầu tài liệu

Doconut hiển thị tài liệu dưới dạng hình ảnh phân trang được phục vụ qua middleware ASP.NET Core. Hiểu vòng đời — mở, token, yêu cầu trang, đóng — giải thích hầu hết các hành vi bạn sẽ quan sát, bao gồm cả các thông báo lỗi.

Ba thành phần chuyển động

  • Viewer — dịch vụ công cộng bạn tiêm vào. Nó mở tài liệu và trả về token phiên.
  • Phiên tài liệu — một đối tượng phía máy chủ giữ tài liệu đã tải, được khóa bằng token trong IMemoryCache.
  • Middleware Doconut — được thêm bằng UseDoconut(); trả lời mọi yêu cầu mà widget trình duyệt thực hiện (pages, thumbnails, search, annotations, …), luôn được xác thực bằng token.

Viewer không có trạng thái — theo thiết kế

Viewer được đóng gói, không giữ trạng thái tài liệu theo yêu cầu, và cố ý không triển khai IDisposable. Các phiên tồn tại độc lập trong trình quản lý phiên và được dọn dẹp bằng việc hết thời gian cache hoặc bằng một lệnh CloseDocument(token) rõ ràng.

Tiêm nó vào bất kỳ nơi nào bạn cần:

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

Những gì xảy ra bên trong OpenDocumentAsync

  1. Cổng giấy phép. Một giấy phép bị từ chối hoặc hết hạn phiên bản (bị đưa vào danh sách đen, bị can thiệp, hoặc một bản dựng ngoài thời gian cập nhật của giấy phép) sẽ ném ra LicenseException ngay lập tức, với lý do từ chối làm tin nhắn — việc mở không bao giờ giảm chất lượng một cách im lặng cho một giấy phép không hợp lệ (trái với việc không có giấy phép). Một giấy phép tạm thời hoặc thuê bao hết hạn theo lịch là ngoại lệ: nó không ném lỗi — nó giảm xuống thành watermark.
  2. Tạo phiên. Nhà máy viewer chọn viewer định dạng phù hợp cho phần mở rộng tệp và tải tài liệu (xem Rendering Pipeline). Phiên được lưu trong IMemoryCache dưới một token GUID mới với thời gian hết hạn trượtDocOptions.TimeOut phút, mặc định 60. Mỗi yêu cầu trang sẽ đặt lại đồng hồ.
  3. Đăng ký bảo mật. Với UnsafeMode = false (mặc định), token được liên kết với phiên ASP.NET của người gọi: một dấu secure-{token} được ghi vào phiên, vì vậy chỉ phiên trình duyệt đã mở tài liệu mới có thể yêu cầu các trang của nó.
  4. Token được trả về. Nó là thông tin xác thực duy nhất cho mọi thứ tiếp theo.

Ba overload chỉ khác nhau ở đầu vào: một đường dẫn tệp, một đường dẫn tệp cộng với cấu hình định dạng riêng (PdfConfig, WordConfig, …), hoặc một Stream cộng với một FileInfo mà phần mở rộng quyết định phát hiện định dạng.

Cách widget lấy các trang

Widget client gọi middleware Doconut với token trong chuỗi truy vấn. Những gì middleware thực hiện phụ thuộc vào yêu cầu:

QueryMục đích
?token=…&page=NHình ảnh trang đã render (PNG)
?token=…&page=N&thumb=1Hình thu nhỏ
?token=…&zoom=…Render trang phóng to
?token=…&search=termTìm kiếm toàn văn (có kiểm soát giấy phép)
?token=…&bookmarksĐề cương tài liệu/dấu trang
?token=…&copy / &showlinks / &fileFormat / &metaSao chép văn bản, liên kết, thông tin định dạng, siêu dữ liệu kỹ thuật DICOM
?token=…&action=rotate/flip/closeCác hành động trang và đóng rõ ràng
?token=…&AnnSave=… / &AnnLoadLưu/tải chú thích

Mỗi đường dẫn này đều được xác thực trước:

  • Không có token → middleware trả về 404 (hoặc một banner phiên bản khi ShowDoconutInfo = true).
  • Token không xác định hoặc đã hết hạn → một hình ảnh lỗi với Document session not found. Please re-open document.
  • Middleware phiên bị thiếu (với UnsafeMode = false) → HTTP 500 với Session middleware not configured. Call UseSession() before UseDoconut().
  • Token được mở bởi một phiên trình duyệt khác → một hình ảnh lỗi với You Are Not Authorized To View This Page.

Đóng tài liệu

csharp
viewer.CloseDocument(token);

CloseDocument xóa phiên khỏi cache (điều này giải phóng engine tài liệu nền và giải phóng bộ nhớ ngay lập tức), xóa dấu secure-{token}, và thu hồi quyền truy cập. Gọi nó là tùy chọn — thời gian hết hạn trượt sẽ tự động dọn dẹp — nhưng đối với tài liệu lớn, đây là cách lịch sự để giải phóng bộ nhớ ngay khi người dùng hoàn thành.

Những điểm cần nhớ

  • Một tài liệu mở = một phiên = một token. Token thuộc về mỗi phiên trình duyệt, không phải URL toàn cục.
  • Token hết hạn theo cửa sổ trượt; một viewer để không hoạt động quá DocOptions.TimeOut cần mở lại.
  • Viewer có thể được tiêm và chia sẻ tự do; các phiên chứa toàn bộ trạng thái.

Trang này có hữu ích không?