DoconutHost

Die Kompositionswurzel für System.Web

DoconutHost (Namespace Doconut) ist eine statische Klasse, die Doconut‑Dienste für den gesamten Worker‑Prozess verwaltet. ASP.NET‑Core‑Anwendungen bauen diese Dienste in den eigenen Container des Frameworks ein; klassisches ASP.NET hat keinen Container, daher erstellt DoconutHost einen und behält ihn. Der DocImage.axd‑Handler und das Ressourcen‑Modul lösen alles, was sie benötigen, daraus auf, und das tut Ihr Code ebenfalls.

MitgliedZweck
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null)Erstellt die Services — einmal
static IServiceProvider Services { get; }Der erstellte Container
static bool IsInitialized { get; }true sobald Initialize ausgeführt wurde
static void Shutdown()Stoppt Hintergrundarbeit und gibt den Container frei

Initialisieren

Rufen Sie es aus Application_Start in Global.asax.cs auf:

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 erhält die DoconutOptionen: Lizenz, Sicherheitsschalter, Plugins, Widgets.
  • configureServices ist optional. Es wird ausgeführt, nachdem Doconut seine eigenen Dienste registriert hat und bevor der Container gebaut wird, sodass zusätzliche Dienste hinzugefügt — AddDoconutDistributed für einen Web‑Farm ist üblich — oder eine Registrierung von Doconut ersetzt werden kann.

Der erste Aufruf gewinnt. Initialize ist idempotent: ein zweiter Aufruf kehrt sofort zurück, und keiner seiner Delegaten wird ausgeführt. Das macht einen duplizierten Application_Start harmlos, bedeutet jedoch, dass die Konfiguration nicht geändert werden kann, indem Initialize erneut aufgerufen wird — recyceln Sie stattdessen den Anwendungspool.

Eine hier ausgelöste Ausnahme — ein Plugin ohne Lizenz, ungültige Optionen, eine unvollständige Farm‑Konfiguration — tritt innerhalb von Application_Start auf. ASP.NET beantwortet dann jede Anfrage mit einem leeren 500, und die Ausnahme wird nur im Windows‑Ereignisprotokoll (Anwendungsprotokoll, Quelle ASP.NET) aufgezeichnet.

Services und IsInitialized

System.Web unterstützt keine Konstruktorinjektion für Controller, Seiten oder Handler, daher lösen Sie Doconut‑Dienste dort auf, wo Sie sie benötigen:

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 wirft InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.), wenn es vor Initialize gelesen wird. Code, der früher laufen könnte — ein Modul, ein statischer Konstruktor — kann zuerst IsInitialized prüfen.

Was Ihr Code typischerweise auflöst:

DienstLebensdauerRolle
ViewerTransientÖffnen, schließen, Anmerkungen, Ressourcenhilfen — siehe Betrachter
DocumentConverterTransientKonvertierung — nur mit dem Converter‑Plugin registriert
IDoconutLicenseServiceSingletonDie geladene Lizenz und ihre Fähigkeiten — siehe Lizenzierung
DoconutOptionsSingletonDie an Initialize übergebenen Optionen
HealthCheckServiceSingletonFührt den "doconut"‑Gesundheitscheck aus (siehe unten)

Lösen Sie Dienste über DoconutHost.Services auf, niemals aus einem eigenen Container. Das Registrieren von Doconut in einem anderen Container erzeugt einen zweiten, separaten Satz von Diensten, den Handler und das Modul nicht sehen: Dokumente, die darüber geöffnet werden, sind DocImage.axd unbekannt.

Herunterfahren

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 stoppt Doconut‑Hintergrundarbeiten (verwendet im verteilten Modus) und gibt den Container frei. Es ist sicher, es zweimal aufzurufen, und sicher, wenn Initialize nie gelaufen ist — z. B. wenn der Anwendungspool vor der ersten Anfrage recycelt wird.

Gesundheitscheck

Doconut registriert einen Gesundheitscheck namens "doconut", der den Lizenzstatus meldet. Klassisches ASP.NET hat keinen eigenen Gesundheits‑Endpoint, daher stellen Sie ihn über einen Controller bereit:

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");
}
StatusBedeutung
HealthyEine gültige Lizenz ist geladen
DegradedTestversion oder keine Lizenzdatei gefunden
UnhealthyDie Lizenz ist abgelaufen

Die ASP.NET Core-Erweiterungsmethoden

Das Paket enthält außerdem UseDoconut() und UseDoconutResources(), die ASP.NET‑Core‑Pipeline‑Erweiterungen, weil es seinen Code mit den ASP.NET‑Core‑Paketen teilt. In diesem Paket sind beide mit [Obsolete] gekennzeichnet und werden nicht verwendet: Eine System.Web‑Anwendung hat keine Request‑Pipeline, zu der sie hinzugefügt werden könnten. Ihre Ersatzlösungen sind die beiden Web.config‑Registrierungen aus Installation:

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

War diese Seite hilfreich?