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:

csharp
// 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 حيث تستخدمها:

csharp
// 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.

الإغلاق

csharp
// 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 الكلاسيكي لا يملك نقطة نهاية لفحص الصحة خاصة به، لذا اكشفه من خلال متحكم:

csharp
// 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 injectionDoconutHost.Services.GetRequiredService<T>()
Host shutdownDoconutHost.Shutdown() in Application_End

هل كانت هذه الصفحة مفيدة؟