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.

MiembroPropó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:

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 recibe los DoconutOptions: licencia, interruptores de seguridad, complementos y widgets.
  • configureServices es 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 — AddDoconutDistributed para 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:

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 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:

ServicioTiempo de vidaRol
ViewerTransitorioAbrir, cerrar, anotaciones, ayudantes de recursos — ver Viewer
DocumentConverterTransitorioConversión — registrado solo con el complemento Converter
IDoconutLicenseServiceSingletonLa licencia cargada y sus capacidades — ver Licensing
DoconutOptionsSingletonLas opciones pasadas a Initialize
HealthCheckServiceSingletonEjecuta 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

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 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:

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");
}
EstadoSignificado
HealthySe ha cargado una licencia válida
DegradedVersión de prueba, o no se encontró archivo de licencia
UnhealthyLa 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 constructorDoconutHost.Services.GetRequiredService<T>()
Apagado del hostDoconutHost.Shutdown() en Application_End

¿Fue útil esta página?