Razor Pages، MVC وAPIs الحد الأدنى
العارض غير مرتبط بنمط استضافة. قم بعرض div التثبيت من عرض Razor أو صفحة ثابتة وافتح المستند من إجراء تحكم، معالج صفحة أو نقطة نهاية مُعينة.
يتم تسجيل Doconut كما يتم تسجيل كل شيء آخر في ASP.NET Core: خدمة في الحاوية وMiddleware في خط الأنابيب. يرث المصادقة الخاصة بك، وتسجيلك، ورسم بياني DI الخاص بك، وقصة النشر الخاصة بك، لأنه يعمل داخلها بدلاً من جنبها.
المشكلة
معظم عارضي المستندات تأتي كخدمة منفصلة. هذا يعني وحدة نشر ثانية، مجموعة ثانية من بيانات الاعتماد، قفزة شبكة تمر عبرها مستنداتك الآن، وشئًا ثانيًا لتزعج أحدًا به في الساعة 2 صباحًا.
Doconut هي مكتبة. AddDoconut() يضعها في مجموعة الخدمات الخاصة بك؛ UseDoconut() يضعها في خط الأنابيب. تعمل تحت هوية عمليتك، ترى إعداداتك، تكتب إلى مسجلك، وتُنشر بواسطة أي شيء ينشر تطبيقك بالفعل.
الع consequence العملية هي أن التفويض يبقى في مكانه. تستدعي OpenDocumentAsync() بعد فحص الأذونات الخاص بك، ولا يمكن للعارض إلا أن يعرض ما قررت تسليمه.
القدرات
العارض غير مرتبط بنمط استضافة. قم بعرض div التثبيت من عرض Razor أو صفحة ثابتة وافتح المستند من إجراء تحكم، معالج صفحة أو نقطة نهاية مُعينة.
نظرًا لأن نقاط النهاية تعيش في خط الأنابيب الخاص بك، فإن [Authorize] يعمل كما كان دائمًا. لا يوجد نظام هوية ثانٍ للتكامل معه.
أمان المستند يعتمد على حالة جلسة ASP.NET، لذلك يجب تسجيل UseSession() قبل UseDoconut(). وهذا يعني أن مفهوم العارض عن هويتك هو نفسه مفهوم التطبيق.
عقد متعددة خلف موازن تحميل تشارك ذاكرة التخزين المؤقت للعرض، لذا تستمر الجلسة المفتوحة على عقدة واحدة في العمل عندما تصل الطلبات التالية إلى عقدة أخرى.
IIS، Kestrel، أو صورة حاوية تبنيها بنفسك. لا شيء يتغير في التكامل بينها إلا مكان تركيب ملف الترخيص.
مع إضافة Converter، يعمل DocumentConverter.ConvertAsync() في نفس العملية — لا خدمة ثانية، لا تحميل مؤقت، لا جولة إضافية.
التكامل
UserMayRead وResolvePath هما كودك الخاص. هذه هي الفكرة: Doconut لا يكتشف أبدًا أي المستندات موجودة أو من المسموح له رؤيتها.
المنصات المدعومة
// Program.cs
builder.Services.AddDoconut(options =>
{
options.LicensePath = "Doconut.Viewer.lic";
});
builder.Services.AddSession(); // document security rides on session state
var app = builder.Build();
app.UseSession(); // call UseSession() before UseDoconut()
app.UseDoconutResources(); // must be registered before UseDoconut()
app.UseDoconut();
// Open the document server-side, behind your own authorization
app.MapPost("/api/open", async (Viewer viewer, HttpContext ctx, string documentId) =>
{
if (!await ctx.UserMayRead(documentId))
return Results.Forbid();
// The token is opaque — hand it to the widget, never log or persist it.
string token = await viewer.OpenDocumentAsync(ResolvePath(documentId));
return Results.Ok(new { token });
}).RequireAuthorization();التفاصيل
نعم. كلاهما مدعومان ويستخدمان نفس بنية DI زائد Middleware. هناك صفحات مخصصة لكل منهما إذا كنت بحاجة إلى تفاصيل خاصة بالإصدار.
لا، وهذا مقصود. التكامل دائمًا يكون Middleware بالإضافة إلى عنصر JavaScript، مما يحافظ على صلاحية التكامل نفسه عبر Razor Pages، MVC، Web Forms وBlazor بدلاً من تجزئته إلى أربعة.
مزرعة الويب والنشر الموزع مدعومان عبر ذاكرة تخزين مؤقت مشتركة للعرض. المستند المفتوح على عقدة واحدة يظل قابلًا للقراءة عندما تصل الطلبات اللاحقة إلى عقدة أخرى.
لا. العرض أصلي — لا يوجد تفاعل مع Office، ولا Word بدون واجهة، ولا أتمتة COM لتدبيرها.
رخصة مؤقتة تستغرق بضع دقائق لطلبها وتعمل بالكامل على جهازك الخاص. الملفات المهمة هي تلك التي تُعطِّل عارضك الحالي بالفعل.