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 - یک بار برای هر فرآیند کارگر. فراخوانی دوم هیچ کاری انجام نمی‌دهد:
// گزینه‌های فراخوانی اول برتری دارند.
Doconut.DoconutHost.Initialize(
    options =>
    {
        options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
    },
    services =>
    {
        // اختیاری. پس از ثبت‌های خود Doconut اجرا می‌شود و قبل از ساخت کانتینر،
        // تا بتواند سرویس‌ها را اضافه کند یا یکی از سرویس‌های ثبت‌شده توسط Doconut را جایگزین کند.
        services.AddMemoryCache();
    });
  • configure دریافت می‌کند گزینه‌های Doconut: مجوز، سوئیچ‌های امنیتی، افزونه‌ها، ویجت‌ها.
  • configureServices اختیاری است. پس از این که Doconut سرویس‌های خود را ثبت کرد و پیش از ساختن کانتینر اجرا می‌شود، بنابراین می‌تواند سرویس‌ها را اضافه کند — AddDoconutDistributed برای یک فارم وب معمول است — یا ثبت‌نامی که Doconut انجام داده را جایگزین کند.

اولین فراخوانی برنده است. Initialize ایستدومنت است: یک فراخوانی دوم بلافاصله برمی‌گردد، و هیچ‌یک از نمایندگان آن اجرا نمی‌شود. این باعث می‌شود یک Application_Start تکراری بی‌ضرر بماند، اما همچنین به این معنی است که پیکربندی را نمی‌توان با فراخوانی مجدد Initialize تغییر داد — به جای آن استخر برنامه را بازیابی کنید.

یک استثنا که اینجا پرتاب می‌شود — افزونه‌ای بدون مجوز، گزینه‌های نامعتبر، پیکربندی ناقص فارم — داخل Application_Start رخ می‌دهد. سپس ASP.NET به هر درخواست با یک 500 خالی پاسخ می‌دهد، و استثنا فقط در لاگ رویداد ویندوز (لاگ برنامه، منبع ASP.NET) ثبت می‌شود.

سرویس‌ها و IsInitialized

System.Web تزریق سازنده برای کنترلرها، صفحات یا هندلرها ندارد، بنابراین سرویس‌های Doconut را در جایی که از آن‌ها استفاده می‌کنید حل کنید:

csharp
// System.Web سازنده‌ای برای تزریق ندارد: سرویس‌های Doconut را در جایی که استفاده می‌کنید حل کنید.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();

// فقط زمانی که افزونه Converter فعال باشد ثبت می‌شود (صفحه افزونه را ببینید).
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();

Services زمانی که قبل از Initialize خوانده شود، InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) پرتاب می‌کند. کدی که ممکن است زودتر اجرا شود — یک ماژول، سازنده استاتیک — می‌تواند ابتدا IsInitialized را بررسی کند.

چیزی که کد شما معمولاً حل می‌کند:

سرویسطول عمرنقش
Viewerموقتباز کردن، بستن، حاشیه‌نویسی‌ها، کمک‌کننده‌های منبع — مشاهده نمایشگر
DocumentConverterموقتتبدیل — فقط با افزونه Converter ثبت شده
IDoconutLicenseServiceتک‌نمونهمجوز بارگذاری‌شده و قابلیت‌های آن — مشاهده مجوزدهی
DoconutOptionsتک‌نمونهگزینه‌های پاس داده شده به Initialize
HealthCheckServiceتک‌نمونهچک سلامت "doconut" را اجرا می‌کند (در زیر)

از DoconutHost.Services حل کنید، هرگز از یک کانتینر خودتان استفاده نکنید. ثبت Doconut در یک کانتینر دیگر مجموعه دوم، جداگانه‌ای از سرویس‌ها را می‌سازد که هندلر و ماژول هرگز نمی‌بینند: اسنادی که از طریق آن باز می‌شوند برای DocImage.axd ناشناخته هستند.

خاموش‌سازی

csharp
// Global.asax.cs، Application_End - کار پس‌زمینه را متوقف می‌کند و کانتینر را از بین می‌برد.
// ایمن برای فراخوانی دو بار، و ایمن وقتی Initialize هرگز اجرا نشده باشد.
Doconut.DoconutHost.Shutdown();

Shutdown کار پس‌زمینه Doconut را متوقف می‌کند (که در حالت توزیع‌شده استفاده می‌شود) و کانتینر را آزاد می‌کند. فراخوانی آن دو بار ایمن است، و ایمن است وقتی Initialize هرگز اجرا نشده — برای مثال وقتی استخر برنامه قبل از اولین درخواست بازیابی می‌شود.

چک سلامت

Doconut یک چک سلامت به نام "doconut" ثبت می‌کند که وضعیت مجوز را گزارش می‌دهد. ASP.NET کلاسیک نقطه انتهایی چک سلامت خود را ندارد، بنابراین آن را از یک کنترلر در دسترس قرار دهید:

csharp
// GET /Health - Doconut یک بررسی سلامت «doconut» را ثبت می‌کند که وضعیت مجوز را گزارش می‌دهد:
// سالم (معتبر)، کاهش‌یافته (آزمایشی یا بدون فایل مجوز)، ناسالم (منقضی شده).
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(...) در Application_Start
app.UseDoconut()Doconut.DocImageHandler در DocImage.axd در Web.config
app.UseDoconutResources()Doconut.DoconutResourceModule در Web.config
تزریق سازندهDoconutHost.Services.GetRequiredService<T>()
خاموشی میزبانDoconutHost.Shutdown() در Application_End

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