DoconutHost
Кореневий компонент для System.Web
DoconutHost (простір імен 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() | Зупиняє фонова роботу та звільняє контейнер |
Initialize
Викличте у Application_Start у Global.asax.cs:
// Global.asax.cs, Application_Start - один раз на процес‑робітник. Другий виклик нічого не робить:
// параметри першого виклику мають пріоритет.
Doconut.DoconutHost.Initialize(
options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
},
services =>
{
// Необов’язково. Виконується після реєстрації Doconut і до створення контейнера,
// тому можна додати сервіси або замінити вже зареєстрований.
services.AddMemoryCache();
});configureотримує DoconutOptions: ліцензію, перемикачі безпеки, плагіни, віджети.configureServicesнеобов’язковий. Виконується після реєстрації сервісів Doconut і до створення контейнера, тому можна додати сервіси — наприкладAddDoconutDistributedдля веб‑ферми — або замінити реєстрацію, яку зробив Doconut.
Перший виклик переважає. Initialize ідемпотентний: другий виклик повертається одразу, і жоден з його делегатів не виконується. Це робить дублювання Application_Start безпечним, але також означає, що конфігурацію не можна змінити повторним викликом Initialize — перезапустіть пул додатків.
Виняток, який виникає тут — плагін без ліцензії, неправильні параметри, неповна конфігурація ферми — відбувається всередині Application_Start. ASP.NET тоді відповідає на кожен запит порожнім 500, а виключення записується лише в журнал подій Windows (журнал Application, джерело ASP.NET).
Services and IsInitialized
System.Web не підтримує ін’єкцію через конструктор для контролерів, сторінок чи обробників, тому отримуйте сервіси Doconut там, де їх використовуєте:
// System.Web не підтримує ін’єкцію через конструктор: отримуйте сервіси Doconut там, де їх використовуєте.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
// Реєструється лише коли підключений плагін Converter (див. сторінку плагіна).
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 | Transient | Відкриття, закриття, анотації, допоміжні ресурси — див. Viewer |
DocumentConverter | Transient | Конвертація — реєструється лише з плагіном Converter |
IDoconutLicenseService | Singleton | Завантажена ліцензія та її можливості — див. Licensing |
DoconutOptions | Singleton | Параметри, передані в Initialize |
HealthCheckService | Singleton | Виконує health‑check "doconut" (нижче) |
Отримуйте сервіси через DoconutHost.Services, ніколи не використовуйте власний контейнер. Реєстрація Doconut в іншому контейнері створює другий, окремий набір сервісів, які обробник і модуль не бачать: документи, відкриті через нього, будуть невідомі DocImage.axd.
Shutdown
// Global.asax.cs, Application_End - зупиняє фонова роботу і звільняє контейнер.
// Безпечно викликати двічі, і безпечно, якщо Initialize ніколи не виконувалось.
Doconut.DoconutHost.Shutdown();Shutdown зупиняє фонова роботу Doconut (використовується в розподіленому режимі) і звільняє контейнер. Це безпечно викликати двічі і безпечно, якщо Initialize не було виконано — наприклад, коли пул додатків перезапускається до першого запиту.
Health check
Doconut реєструє health‑check з назвою "doconut", який повідомляє стан ліцензії. Класичний ASP.NET не має власної точки health‑check, тому її треба експортувати через контролер:
// GET /Health - Doconut реєструє health‑check "doconut", який повідомляє стан ліцензії:
// Healthy (дійсна), Degraded (пробна або відсутня ліцензійна файл), Unhealthy (закінчилася).
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 | Термін дії ліцензії закінчився |
The ASP.NET Core extension methods
Пакет також містить UseDoconut() і UseDoconutResources(), розширення конвеєра ASP.NET Core, бо код спільний з пакетами ASP.NET Core. У цьому пакеті обидва позначені [Obsolete] і не використовуються: у застосунку System.Web немає конвеєра запитів, куди їх можна додати. Їхні замінники — два реєстрації в Web.config з розділу Installation:
| 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 |
| Constructor injection | DoconutHost.Services.GetRequiredService<T>() |
| Host shutdown | DoconutHost.Shutdown() у Application_End |
Чи була ця сторінка корисною?