DoconutHost
الجذر التركيبي لـ System.Web
DoconutHost (namespace Doconut) هو صف ثابت يمتلك خدمات Doconut لكامل عملية العامل. تطبيقات ASP.NET Core تبني تلك الخدمات داخل حاوية الإطار نفسها؛ ASP.NET الكلاسيكي لا يملك حاوية، لذا يقوم DoconutHost بإنشاء واحدة ويحافظ عليها. معالج DocImage.axd ووحدة الموارد يحلان كل ما يحتاجان إليه منها، وكذلك شفرتك.
| العضو | الغرض |
|---|---|
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null) | يبني الخدمات — مرة واحدة |
static IServiceProvider Services { get; } | الحاوية المبنية |
static bool IsInitialized { get; } | true بمجرد تشغيل Initialize |
static void Shutdown() | يوقف العمل الخلفي ويحرّر الحاوية |
التهيئة
استدعها من Application_Start في Global.asax.cs:
// Global.asax.cs, Application_Start - once per worker process. A second call is a no-op:
// the first call's options win.
Doconut.DoconutHost.Initialize(
options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
},
services =>
{
// Optional. Runs after Doconut's own registrations and before the container is built,
// so it can add services or replace one Doconut registered.
services.AddMemoryCache();
});configureيتلقى الـ خيارات Doconut: الترخيص، مفاتيح الأمان، الإضافات، الأدوات.configureServicesاختياري. يتم تشغيله بعد أن يسجل Doconut خدماته الخاصة وقبل بناء الحاوية، بحيث يمكنه إضافة خدمات —AddDoconutDistributedلمزرعة ويب هو المعتاد — أو استبدال تسجيل قام Doconut بإنشائه.
المكالمة الأولى هي الفائزة. Initialize غير قابل للتغيير: المكالمة الثانية تُعيد مباشرة، ولا يُنفّذ أي من المندوبين الخاصين به. هذا يجعل تكرار Application_Start غير ضار، لكنه يعني أيضًا أن الإعداد لا يمكن تغييره بإعادة استدعاء Initialize — أعد تدوير مجموعة التطبيقات بدلاً من ذلك.
استثناء يُرمى هنا — إضافة بدون ترخيص، خيارات غير صالحة، تكوين مزرعة غير مكتمل — يحدث داخل Application_Start. ثم يرد ASP.NET على كل طلب بـ 500 فارغ، ويسجل الاستثناء فقط في سجل أحداث Windows (سجل التطبيقات، المصدر ASP.NET).
الخدمات و IsInitialized
System.Web لا يدعم حقن البنية للمتحكمات أو الصفحات أو المعالجات، لذا حلّ خدمات Doconut حيث تستخدمها:
// System.Web has no constructor injection: resolve Doconut services where you use them.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
// Registered only when the Converter plugin is (see the plugin page).
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();Services تُطلق InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) عند القراءة قبل Initialize. يمكن للكود الذي قد يُنفّذ مبكرًا — وحدة، مُنشئ ثابت — فحص IsInitialized أولًا.
ما الذي تحله شفرتك عادةً:
| الخدمة | مدة الحياة | الدور |
|---|---|---|
Viewer | مؤقت | الفتح، الإغلاق، التعليقات، مساعدي الموارد — انظر المشاهد |
DocumentConverter | مؤقت | التحويل — يُسجَّل فقط مع إضافة Converter |
IDoconutLicenseService | فردي | الترخيص المحمَّل وإمكاناته — انظر الترخيص |
DoconutOptions | فردي | الخيارات التي تم تمريرها إلى Initialize |
HealthCheckService | فردي | يُنفّذ فحص الصحة "doconut" (أدناه) |
احلّ من DoconutHost.Services، ولا تستخدم حاوية خاصة بك. تسجيل Doconut في حاوية أخرى يُنشئ مجموعة ثانية منفصلة من الخدمات لا يراها المعالج أو الوحدة: المستندات المفتوحة عبرها غير معروفة لـ DocImage.axd.
الإغلاق
// Global.asax.cs, Application_End - stops background work and disposes the container.
// Safe to call twice, and safe when Initialize never ran.
Doconut.DoconutHost.Shutdown();Shutdown يوقف عمل Doconut الخلفي (المستعمل في الوضع الموزع) ويحرّر الحاوية. من الآمن استدعاؤه مرتين، ومن الآمن عندما لا تُنفّذ Initialize — مثلاً عندما تُدوَّر مجموعة التطبيقات قبل الطلب الأول.
فحص الصحة
Doconut يسجِّل فحص صحة باسم "doconut" يُبلغ عن حالة الترخيص. ASP.NET الكلاسيكي لا يملك نقطة نهاية لفحص الصحة خاصة به، لذا اكشفه من خلال متحكم:
// GET /Health - Doconut registers a "doconut" health check that reports the license state:
// Healthy (valid), Degraded (trial or no license file), Unhealthy (expired).
public async Task<ActionResult> Index()
{
var health = Doconut.DoconutHost.Services.GetRequiredService<HealthCheckService>();
HealthReport report = await health.CheckHealthAsync();
Response.StatusCode = report.Status == HealthStatus.Unhealthy ? 503 : 200;
return Content(report.Status.ToString(), "text/plain");
}| الحالة | المعنى |
|---|---|
Healthy | تم تحميل ترخيص صالح |
Degraded | نسخة تجريبية، أو لا يوجد ملف ترخيص |
Unhealthy | انتهت صلاحية الترخيص |
أساليب امتداد ASP.NET Core
الحزمة تحتوي أيضًا على UseDoconut() و UseDoconutResources()، امتدادات خط أنابيب ASP.NET Core، لأنها تشارك شيفرتها مع حزم ASP.NET Core. في هذه الحزمة كلاهما مُعلَّم بـ [Obsolete] ولا يُستخدمان: تطبيق System.Web لا يملك خط أنابيب طلبات لإضافتهما إليه. بدائلهم هي تسجيلين في Web.config من التثبيت:
| ASP.NET Core | .NET Framework 4.7.2 |
|---|---|
builder.Services.AddDoconut(...) | DoconutHost.Initialize(...) in Application_Start |
app.UseDoconut() | Doconut.DocImageHandler on DocImage.axd in Web.config |
app.UseDoconutResources() | Doconut.DoconutResourceModule in Web.config |
| Constructor injection | DoconutHost.Services.GetRequiredService<T>() |
| Host shutdown | DoconutHost.Shutdown() in Application_End |
هل كانت هذه الصفحة مفيدة؟