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:

csharp
// 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 там, де їх використовуєте:

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

Що зазвичай отримує ваш код:

СервісТермін життяРоль
ViewerTransientВідкриття, закриття, анотації, допоміжні ресурси — див. Viewer
DocumentConverterTransientКонвертація — реєструється лише з плагіном Converter
IDoconutLicenseServiceSingletonЗавантажена ліцензія та її можливості — див. Licensing
DoconutOptionsSingletonПараметри, передані в Initialize
HealthCheckServiceSingletonВиконує health‑check "doconut" (нижче)

Отримуйте сервіси через DoconutHost.Services, ніколи не використовуйте власний контейнер. Реєстрація Doconut в іншому контейнері створює другий, окремий набір сервісів, які обробник і модуль не бачать: документи, відкриті через нього, будуть невідомі DocImage.axd.

Shutdown

csharp
// Global.asax.cs, Application_End - зупиняє фонова роботу і звільняє контейнер.
// Безпечно викликати двічі, і безпечно, якщо Initialize ніколи не виконувалось.
Doconut.DoconutHost.Shutdown();

Shutdown зупиняє фонова роботу Doconut (використовується в розподіленому режимі) і звільняє контейнер. Це безпечно викликати двічі і безпечно, якщо Initialize не було виконано — наприклад, коли пул додатків перезапускається до першого запиту.

Health check

Doconut реєструє health‑check з назвою "doconut", який повідомляє стан ліцензії. Класичний ASP.NET не має власної точки health‑check, тому її треба експортувати через контролер:

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

Чи була ця сторінка корисною?