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ụ bởi một HTTP handler mà Web.config của bạn đăng ký. 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 thông báo lỗi.
Các thành phần hoạt động
Viewer— dịch vụ công cộng bạn giải quyết từDoconutHost.Services. Nó mở tài liệu và trả về token phiên.- The document session — một đối tượng phía máy chủ giữ tài liệu đã tải, được lưu trong bộ nhớ dưới token của nó.
DocImage.axd—Doconut.DocImageHandlerđược khai báo trongWeb.config. Nó trả lời mọi yêu cầu mà widget trình duyệt thực hiện (trang, hình thu nhỏ, tìm kiếm, chú thích, …), luôn được xác định bằng token./doconut-res/*—Doconut.DoconutResourceModule, cung cấp các script, style và biểu tượng của widget.
Viewer là không trạng thái — theo thiết kế
Viewer không giữ trạng thái tài liệu theo yêu cầu và không triển khai IDisposable. Các phiên tồn tại độc lập với nó và được dọn dẹp bằng việc hết hạn hoặc một CloseDocument(token) rõ ràng. System.Web không có injection qua constructor, vì vậy hãy giải quyết nó ở nơi bạn cần — thường là trong một hành động controller:
// 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");
}Điều gì xảy ra bên trong OpenDocumentAsync
- Cổng giấy phép. Một giấy phép bị từ chối (bị can thiệp, nằm trong danh sách đen, hoặc bản dựng ngoài cửa sổ cập nhật của giấy phép) sẽ ném
LicenseExceptionngay lập tức, với lý do là thông điệp. Việc mở không bao giờ giảm chất lượng một cách âm thầm cho giấy phép không hợp lệ; giấy phép thiếu chỉ thêm watermark. - Tạo phiên. Nhà máy viewer chọn viewer định dạng cho phần mở rộng tệp và tải tài liệu (xem Rendering Pipeline). Phiên được lưu trong bộ nhớ dưới một token ngẫu nhiên mới với thời gian hết hạn trượt là
DocOptions.TimeOutphút (mặc định 60). Mỗi yêu cầu trang sẽ đặt lại đồng hồ. - Cấp quyền truy cập. Với
UnsafeMode = false(mặc định), token được gắn vào phiên ASP.NET của yêu cầu đã mở nó: một mụcsecure-{token}được ghi vào phiên đó. Do đó, việc mở phải diễn ra trong một yêu cầu có trạng thái phiên — xem Sessions & Security. - Token được trả về. Đây là định danh duy nhất mà trình duyệt cần cho mọi thứ tiếp theo.
Các overload bất đồng bộ nhận một đường dẫn tệp, một đường dẫn tệp cộng với cấu hình theo định dạng (PdfConfig, WordConfig, …), hoặc một Stream cộng với một FileInfo mà phần mở rộng xác định định dạng. Đối với code-behind Web Forms không sử dụng trang bất đồng bộ, OpenDocument cung cấp cùng ba đầu vào một cách đồng bộ (đường dẫn, một stream có tên tệp, hoặc một mảng byte có tên tệp).
Cách widget lấy các trang
Widget gọi DocImage.axd với token trong chuỗi truy vấn. Hành động của handler phụ thuộc vào yêu cầu:
| Truy vấn | Mục đích |
|---|---|
?token=…&page=N | Hình ảnh trang đã render (PNG) |
?token=…&page=N&thumb=1 | Hình thu nhỏ |
?token=…&zoom=… | Render trang phóng to |
?token=…&search=term | Tìm kiếm toàn văn (có kiểm soát giấy phép) |
?token=…&bookmarks | Đề cương tài liệu và dấu trang |
?token=…© / &showlinks / &fileFormat / &meta | Sao chép văn bản, siêu liên kết, thông tin định dạng, siêu dữ liệu DICOM |
?token=…&action=rotate/flip/close | Hành động trang và đóng rõ ràng (POST) |
?token=…&AnnSave=… / &AnnLoad | Lưu và tải chú thích |
Mỗi yêu cầu được kiểm tra đầu tiên:
- Không có token →
404, hoặc một banner phiên bản khiShowDoconutInfo = true. - Token không được cấp cho ASP.NET session này → một hình ảnh lỗi chứa nội dung
You Are Not Authorized To View This Page. - Token không xác định hoặc đã hết hạn → một hình ảnh lỗi chứa nội dung
Document session not found. Please re-open document.
Các hình ảnh lỗi là PNG thông thường được gửi với trạng thái 200, vì vậy widget có thể hiển thị chúng ở vị trí trang. Một kiểm tra giám sát chỉ nhìn vào mã trạng thái sẽ báo chúng là các trang đã phục vụ; một trang thực tế có kích thước từ vài chục đến hàng trăm kilobyte, trong khi hình ảnh lỗi khoảng 2 KB.
Đóng tài liệu
viewer.CloseDocument(token);CloseDocument loại bỏ phiên (giải phóng engine tài liệu và bộ nhớ ngay lập tức), loại bỏ mục secure-{token} khỏi ASP.NET session của yêu cầu hiện tại, và thu hồi token. Điều này là tùy chọn — thời gian hết hạn trượt thực hiện cùng việc dọn dẹp — nhưng đối với tài liệu lớn nó giải phóng bộ nhớ ngay khi người dùng hoàn thành. Từ trình duyệt, objViewer.Close(true) gửi yêu cầu đóng tương đương tới DocImage.axd.
Những điểm cần nhớ
- Một tài liệu mở = một phiên = một token, được cấp cho ASP.NET session đã mở nó.
- Token hết hạn theo cửa sổ trượt; một viewer để không hoạt động quá
DocOptions.TimeOutcần mở lại. Viewercó thể được giải quyết và chia sẻ tự do; các phiên mang toàn bộ trạng thái.
Trang này có hữu ích không?