
نحوه پیکربندی Doconut برای استقرارهای سرور توزیعشده
استفاده از Doconut در پیکربندی سرور توزیعشده
وقتی نیاز دارید PDFها، فایلهای Office، نقشههای CAD یا تصاویر را از یک خوشه از گرههای ASP.NET Core سرو کنید، حالت توزیعشده Doconut به هر گره امکان میدهد که آثار صفحه یکسان را از یک مکان مشترک بخواند. نتیجه یک نمایشگر افقی‑مقیاسپذیر و ایمن است که پشت یک تعادلبار بدون نشستهای چسبنده کار میکند.
چرا حالت توزیعشده مهم است
- قابلیت مقیاسپذیری – هر گره میتواند صفحات را به یک اشتراک UNC یا ابری منتشر کند؛ هر گره دیگر میتواند بلافاصله آنها را سرو کند.
- امنیت – آثار به صورت رمزگذاریشده در پوشهٔ مشترک ذخیره میشوند؛ نمایشگر هر درخواست را نسبت به توکن نشست ASP.NET اعتبارسنجی میکند.
- بدون وابستگی به Office – افزونهٔ Converter به صورت سرور‑ساید اجرا میشود و Word، Excel، PowerPoint، CAD و تصاویر را به PDF یا تصویر تبدیل میکند بدون اینکه نیاز به نصب Microsoft Office باشد.
این ویژگیها به سامانههای DMS، CRM یا پورتالهای e‑learning سازمانی اجازه میدهد پردازش اسناد را در پشتصحنهٔ .NET نگه دارند و در عین حال به دهها کانتینر مقیاسپذیر شوند.
ذخیرهسازی مشترک برای حالت توزیعشده
در حالت توزیعشده Doconut انتظار دارد که آثار صفحه (صفحات PDF، کاشیهای تصویر و غیره) در مکانی ذخیره شوند که توسط هر گرهٔ مزرعه قابل دسترسی باشد – یک اشتراک شبکهای، کانتینر Azure Blob، سطل S3 یا هر ذخیرهسازی مشترک دیگری که توسط ویژگی Progressive Cloud Publishing پشتیبانی میشود. نمایشگر بهصورت خودکار پوشهٔ آثار را که با توکن امنیتی هر سند مطابقت دارد جستجو میکند، بنابراین هیچ کد اضافیای لازم نیست جز اطمینان از اینکه تمام گرهها دسترسی خواندن‑نوشتن یکسانی به ذخیرهسازی انتخابشده داشته باشند.
نکته: از مسیر UNC یکسان (مثلاً
\\fileserver\doconut) یا URL ابری در پیکربندی هر نمونه استفاده کنید و دسترسیهای پوشه را یکسان نگه دارید. رفتارUsePerTokenSubfoldersبهصورت پیشفرض فعال است و صفحات هر سند را جدا میکند.
ثبت Doconut و میدلویر جلسه
Doconut برای امنیت هر سند به وضعیت جلسه ASP.NET Core متکی است. یک کش توزیعشده فقط زمانی لازم است که از پروژهٔ minimal‑API استفاده کنید؛ MVC یا Razor Pages قبلاً یکی را اضافه میکنند.
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
});
builder.Services.AddDistributedMemoryCache(); // session به یک cache نیاز دارد
builder.Services.AddSession(); // Doconut در برابر session اعتبارسنجی میکند
app.UseSession(); // باید قبل از UseDoconut() اجرا شود
app.UseDoconutResources(); // static viewer assets را ثبت میکند
app.Map("/doconut", branch => branch.UseDoconut());
مسیرهای سفارشی (اختیاری)
اگر مسیر دیگری با /doconut تداخل داشته باشد، مسیرها را یکبار تغییر دهید و کلاینت BasePath را همگام نگه دارید:
builder.Services.AddDoconut(options =>
{
options.MiddlewarePath = "/docs-engine";
options.ResourcesPath = "/docs-assets";
});
app.UseDoconutResources();
app.Map("/docs-engine", branch => branch.UseDoconut());
هرگز اسلش پیشرو را به MiddlewarePath یا ResourcesPath اضافه نکنید؛ نمایشگر بهصورت خودکار اسلش را اضافه میکند.
ترکیب همه موارد: مثال Minimal‑API
در زیر یک تنظیمات فشرده و آماده برای تولید آورده شده است که نیاز به ذخیرهسازی مشترک، مدیریت جلسه و ثبت Doconut را ترکیب میکند.
var builder = WebApplication.CreateBuilder(args);
// 1️⃣ ثبت Core Doconut
builder.Services.AddDoconut(options =>
{
options.LicensePath = Path.Combine(
AppContext.BaseDirectory, "wwwroot", "Doconut.Viewer.lic");
options.MiddlewarePath = "/doconut";
options.ResourcesPath = "/doconut-res";
});
// 2️⃣ Session و cache (برای امنیت لازم است)
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession();
var app = builder.Build();
app.UseRouting();
app.UseSession();
app.UseDoconutResources(); // بستهٔ static viewer
app.Map("/doconut", branch => branch.UseDoconut());
app.Run();
این باینری را به هر تعداد کانتینر Docker یا سرویس ویندوزی پشت یک تعادلبار مستقر کنید. تا زمانی که هر نمونه بتواند به مکان ذخیرهسازی مشترکی که برای آثار صفحه پیکربندی کردهاید دسترسی داشته باشد، نمایشگر صفحات را از هر گره دریافت میکند و بارگذاریها/تبدیلها از پرش گرهها عبور میکنند.
استقرار پشت یک تعادلبار
- آدرس پایهٔ یکسان را در هر گره منتشر کنید (به عنوان مثال ` در هر گره).
- نشستهای چسبنده را غیرفعال کنید – حالت توزیعشده Doconut نیاز به وابستگی نشست را حذف میکند.
- اطمینان حاصل کنید که نظارت سلامت یک نقطهٔ پایانی پایهٔ برنامهٔ شما را بررسی میکند (به عنوان مثال
/health) تا تعادلبار فقط ترافیک را به گرههای زنده هدایت کند. - پوشهٔ مشترک را برای رشد زیر نظر بگیرید؛ زمان حیات پیشفرض 30 دقیقه ذخیرهسازی را محدود نگه میدارد، اما میتوانید آن را بر حسب نیازهای انطباق تنظیم کنید.
با این مراحل، برنامهٔ .NET شما که به اسناد وابسته است میتواند هزاران بینندهٔ همزمان را سرو کند، هر صفحه را در حالت استراحت رمزگذاری نگه دارد و از هزینهٔ نصب Office بر روی هر سرور جلوگیری کند.
آمادهاید که امتحان کنید؟ یک نسخه آزمایشی رایگان از Doconut دریافت کنید، چندین کانتینر راهاندازی کنید، آنها را به یک مسیر UNC مشترک اشاره دهید و ببینید نمایشگر بدون حتی یک کوکی نشست‑چسبنده مقیاس مییابد.