نحوه کار Viewer

دوره حیات درخواست سند

Doconut اسناد را به صورت تصاویر صفحه‌بندی‌شده رندر می‌کند که توسط یک هندلر HTTP که در Web.config شما ثبت شده است سرو می‌شوند. درک دوره حیات — باز کردن، توکن، درخواست‌های صفحه، بستن — تقریباً تمام رفتارهایی را که مشاهده می‌کنید، از جمله پیام‌های خطا، توضیح می‌دهد.

اجزاء متحرک

  • Viewer — سرویس عمومی که از DoconutHost.Services دریافت می‌کنید. اسناد را باز می‌کند و توکن‌های جلسه را برمی‌گرداند.
  • جلسهٔ سند — یک شیء سمت سرور که سند بارگذاری‌شده را نگه می‌دارد و تحت توکن خود در حافظه نگهداری می‌شود.
  • DocImage.axd — Doconut.DocImageHandler که در Web.config اعلام شده است. به هر درخواست ویجت مرورگر (صفحات، تصویرهای کوچک، جستجو، حاشیه‌نویسی، …) پاسخ می‌دهد و همیشه توسط توکن شناسایی می‌شود.
  • /doconut-res/* — Doconut.DoconutResourceModule که اسکریپت‌ها، استایل‌ها و آیکون‌های خود ویجت را سرو می‌کند.

Viewer بی‌حالت است — به‌صورت پیش‌فرض

Viewer هیچ وضعیت سندی مرتبط با هر درخواست را نگه نمی‌دارد و IDisposable را پیاده‌سازی نمی‌کند. جلسات به‌صورت مستقل از آن زندگی می‌کنند و با انقضا یا یک CloseDocument(token) صریح پاک می‌شوند. System.Web سازنده‌ای برای تزریق ندارد، بنابراین آن را در جایی که نیاز دارید دریافت کنید — معمولاً در یک اکشن کنترلر:

csharp
// 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 می‌افتد

  1. دروازه مجوز. یک مجوز رد شده (دستکاری‌شده، فهرست سیاه، یا ساختی خارج از بازه به‌روزرسانی مجوز) بلافاصله LicenseException را پرتاب می‌کند، با دلیل به‌عنوان پیام. باز کردن هرگز به‌صورت ساکن برای یک مجوز نامعتبر کاهش کیفیت نمی‌یابد؛ یک مجوز مفقود فقط واترمارک می‌شود.
  2. ایجاد جلسه. کارخانه viewer فرمت مناسب برای پسوند فایل را انتخاب می‌کند و سند را بارگذاری می‌نماید (به خط لوله رندرینگ مراجعه کنید). جلسه در حافظه تحت یک توکن تصادفی جدید با انقضای لغزان DocOptions.TimeOut دقیقه (پیش‌فرض 60) ذخیره می‌شود. هر درخواست صفحه ساعت را ریست می‌کند.
  3. اعطای دسترسی. با UnsafeMode = false (پیش‌فرض)، توکن به جلسه ASP.NET درخواست‌کننده‌ای که آن را باز کرده است متصل می‌شود: یک ورودی secure-{token} در آن جلسه نوشته می‌شود. بنابراین باز کردن باید در یک درخواست با وضعیت جلسه اجرا شود — به جلسات و امنیت مراجعه کنید.
  4. توکن برگردانده می‌شود. این تنها شناسه‌ای است که مرورگر برای تمام عملیات بعدی نیاز دارد.

بارگذاری‌های ناهمزمان می‌توانند مسیر فایل، مسیر فایل به‌همراه پیکربندی فرمت‑خاص (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=…&copy / &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 ارسال می‌شوند، بنابراین ویجت می‌تواند آن‌ها را جایی که صفحه باید باشد نمایش دهد. یک بررسی مانیتور که فقط به کد وضعیت نگاه می‌کند، آن‌ها را به‌عنوان صفحات سرو‌شده گزارش می‌دهد؛ یک صفحه واقعی چندین کیلوبایت است، در حالی که تصویر خطا حدود ۲ کیلوبایت است.

بستن یک سند

csharp
viewer.CloseDocument(token);

CloseDocument جلسه را حذف می‌کند (موتور سند و حافظهٔ آن را بلافاصله آزاد می‌سازد)، ورودی secure-{token} را از جلسه ASP.NET درخواست فعلی حذف می‌کند، و توکن را باطل می‌سازد. این کار اختیاری است — انقضای لغزان همان پاک‌سازی را انجام می‌دهد — اما برای اسناد بزرگ حافظه را به‌محض پایان کار کاربر آزاد می‌کند. از مرورگر، objViewer.Close(true) درخواست بسته شدن معادل را به DocImage.axd می‌فرستد.

نکات کلیدی

  • یک سند باز = یک جلسه = یک توکن، که به جلسه ASP.NET که آن را باز کرده اعطا می‌شود.
  • توکن در یک بازهٔ لغزان منقضی می‌شود؛ یک viewer که بیش از DocOptions.TimeOut بیکار بماند نیاز به بازگشایی مجدد دارد.
  • Viewer می‌تواند به‌صورت آزادانه دریافت و به اشتراک گذاشته شود؛ جلسات تمام وضعیت را حمل می‌کنند.

آیا این صفحه مفید بود؟