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 - یک بار برای هر فرآیند کارگر. فراخوانی دوم هیچ کاری انجام نمیدهد:
// گزینههای فراخوانی اول برتری دارند.
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 را در جایی که از آنها استفاده میکنید حل کنید:
// 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 ناشناخته هستند.
خاموشسازی
// Global.asax.cs، Application_End - کار پسزمینه را متوقف میکند و کانتینر را از بین میبرد.
// ایمن برای فراخوانی دو بار، و ایمن وقتی Initialize هرگز اجرا نشده باشد.
Doconut.DoconutHost.Shutdown();Shutdown کار پسزمینه Doconut را متوقف میکند (که در حالت توزیعشده استفاده میشود) و کانتینر را آزاد میکند. فراخوانی آن دو بار ایمن است، و ایمن است وقتی Initialize هرگز اجرا نشده — برای مثال وقتی استخر برنامه قبل از اولین درخواست بازیابی میشود.
چک سلامت
Doconut یک چک سلامت به نام "doconut" ثبت میکند که وضعیت مجوز را گزارش میدهد. ASP.NET کلاسیک نقطه انتهایی چک سلامت خود را ندارد، بنابراین آن را از یک کنترلر در دسترس قرار دهید:
// 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 |
آیا این صفحه مفید بود؟