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.
| Mitglied | Zweck |
|---|---|
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:
// 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();
});configureerhält die DoconutOptionen: Lizenz, Sicherheitsschalter, Plugins, Widgets.configureServicesist optional. Es wird ausgeführt, nachdem Doconut seine eigenen Dienste registriert hat und bevor der Container gebaut wird, sodass zusätzliche Dienste hinzugefügt —AddDoconutDistributedfü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:
// 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:
| Dienst | Lebensdauer | Rolle |
|---|---|---|
Viewer | Transient | Öffnen, schließen, Anmerkungen, Ressourcenhilfen — siehe Betrachter |
DocumentConverter | Transient | Konvertierung — nur mit dem Converter‑Plugin registriert |
IDoconutLicenseService | Singleton | Die geladene Lizenz und ihre Fähigkeiten — siehe Lizenzierung |
DoconutOptions | Singleton | Die an Initialize übergebenen Optionen |
HealthCheckService | Singleton | Fü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
// 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:
// 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");
}| Status | Bedeutung |
|---|---|
Healthy | Eine gültige Lizenz ist geladen |
Degraded | Testversion oder keine Lizenzdatei gefunden |
Unhealthy | Die 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 injection | DoconutHost.Services.GetRequiredService<T>() |
| Host shutdown | DoconutHost.Shutdown() in Application_End |
War diese Seite hilfreich?