DoconutHost
La raíz de composición para System.Web
DoconutHost (namespace Doconut) es una clase estática que posee los servicios de Doconut para todo el proceso de trabajo. Las aplicaciones ASP.NET Core construyen esos servicios dentro del contenedor propio del framework; el ASP.NET clásico no tiene contenedor, por lo que DoconutHost crea uno y lo mantiene. El manejador DocImage.axd y el módulo de recursos resuelven todo lo que necesitan de él, al igual que su código.
| Miembro | Propósito |
|---|---|
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null) | Construye los servicios — una vez |
static IServiceProvider Services { get; } | El contenedor construido |
static bool IsInitialized { get; } | true una vez que Initialize se ha ejecutado |
static void Shutdown() | Detiene el trabajo en segundo plano y elimina el contenedor |
Inicializar
Llámelo desde Application_Start en Global.asax.cs:
// 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();
});configurerecibe los DoconutOptions: licencia, interruptores de seguridad, complementos y widgets.configureServiceses opcional. Se ejecuta después de los registros propios de Doconut y antes de que se construya el contenedor, por lo que puede agregar servicios —AddDoconutDistributedpara una granja web es el caso habitual — o reemplazar un registro que Doconut haya creado.
La primera llamada gana. Initialize es idempotente: una segunda llamada devuelve inmediatamente, y ninguno de sus delegados se ejecuta. Eso mantiene inofensivo un Application_Start duplicado, pero también significa que la configuración no puede cambiarse llamando a Initialize de nuevo — recicle el grupo de aplicaciones en su lugar.
Una excepción lanzada aquí — un complemento sin licencia, opciones inválidas, una configuración de granja incompleta — ocurre dentro de Application_Start. ASP.NET entonces responde a cada solicitud con un 500 vacío, y la excepción se registra solo en el registro de eventos de Windows (registro de Aplicación, origen ASP.NET).
Servicios e IsInitialized
System.Web no tiene inyección de constructor para controladores, páginas o manejadores, por lo que debe resolver los servicios de Doconut donde los use:
// 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 lanza InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) cuando se lee antes de Initialize. El código que pueda ejecutarse antes — un módulo, un constructor estático — puede comprobar primero IsInitialized.
Lo que su código típicamente resuelve:
| Servicio | Tiempo de vida | Rol |
|---|---|---|
Viewer | Transitorio | Abrir, cerrar, anotaciones, ayudantes de recursos — ver Viewer |
DocumentConverter | Transitorio | Conversión — registrado solo con el complemento Converter |
IDoconutLicenseService | Singleton | La licencia cargada y sus capacidades — ver Licensing |
DoconutOptions | Singleton | Las opciones pasadas a Initialize |
HealthCheckService | Singleton | Ejecuta la verificación de salud "doconut" (abajo) |
Resuelva desde DoconutHost.Services, nunca desde un contenedor propio. Registrar Doconut en otro contenedor crea un segundo conjunto de servicios separado que el manejador y el módulo nunca ven: los documentos abiertos a través de él son desconocidos para DocImage.axd.
Apagado
// 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 detiene el trabajo en segundo plano de Doconut (usado por el modo distribuido) y elimina el contenedor. Es seguro llamarlo dos veces, y seguro cuando Initialize nunca se ejecutó — por ejemplo cuando el grupo de aplicaciones se recicla antes de la primera solicitud.
Verificación de salud
Doconut registra una verificación de salud llamada "doconut" que informa el estado de la licencia. El ASP.NET clásico no tiene un punto final de verificación de salud propio, por lo que expóngalo desde un controlador:
// 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");
}| Estado | Significado |
|---|---|
Healthy | Se ha cargado una licencia válida |
Degraded | Versión de prueba, o no se encontró archivo de licencia |
Unhealthy | La licencia ha expirado |
Los métodos de extensión de ASP.NET Core
El paquete también contiene UseDoconut() y UseDoconutResources(), las extensiones del pipeline de ASP.NET Core, porque comparte su código con los paquetes de ASP.NET Core. En este paquete ambos están marcados como [Obsolete] y no se usan: una aplicación System.Web no tiene un pipeline de solicitudes al que añadirlos. Sus reemplazos son los dos registros en Web.config de Installation:
| ASP.NET Core | .NET Framework 4.7.2 |
|---|---|
builder.Services.AddDoconut(...) | DoconutHost.Initialize(...) en Application_Start |
app.UseDoconut() | Doconut.DocImageHandler en DocImage.axd en Web.config |
app.UseDoconutResources() | Doconut.DoconutResourceModule en Web.config |
| Inyección de constructor | DoconutHost.Services.GetRequiredService<T>() |
| Apagado del host | DoconutHost.Shutdown() en Application_End |
¿Fue útil esta página?