DoconutHost
Il punto di composizione per System.Web
DoconutHost (namespace Doconut) è una classe statica che possiede i servizi di Doconut per l'intero processo worker. Le applicazioni ASP.NET Core costruiscono quei servizi nel contenitore proprio del framework; ASP.NET classico non ha contenitore, quindi DoconutHost ne crea uno e lo mantiene. Il gestore DocImage.axd e il modulo delle risorse risolvono tutto ciò di cui hanno bisogno da esso, così come il tuo codice.
| Membro | Scopo |
|---|---|
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null) | Costruisce i servizi — una sola volta |
static IServiceProvider Services { get; } | Il contenitore costruito |
static bool IsInitialized { get; } | true una volta che Initialize è stato eseguito |
static void Shutdown() | Ferma il lavoro in background e rilascia il contenitore |
Inizializza
Chiamalo da Application_Start in 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();
});configurericeve le DoconutOptions: licenza, interruttori di sicurezza, plugin, widget.configureServicesè opzionale. Viene eseguito dopo che Doconut ha registrato i propri servizi e prima che il contenitore sia costruito, così può aggiungere servizi —AddDoconutDistributedper un web farm è quello più comune — o sostituire una registrazione effettuata da Doconut.
La prima chiamata vince. Initialize è idempotente: una seconda chiamata restituisce immediatamente, e nessuno dei suoi delegati viene eseguito. Questo rende innocuo un Application_Start duplicato, ma implica anche che la configurazione non può essere modificata richiamando nuovamente Initialize — ricicla il pool di applicazioni invece.
Un'eccezione lanciata qui — un plugin senza licenza, opzioni non valide, configurazione di farm incompleta — avviene all'interno di Application_Start. ASP.NET risponde quindi a ogni richiesta con un 500 vuoto, e l'eccezione viene registrata solo nel registro eventi di Windows (log Applicazione, origine ASP.NET).
Servizi e IsInitialized
System.Web non supporta l'iniezione di costruttori per controller, pagine o gestori, quindi risolvi i servizi di Doconut dove li utilizzi:
// 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 lancia InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) se letto prima di Initialize. Il codice che può essere eseguito prima — un modulo, un costruttore statico — può controllare prima IsInitialized.
Ciò che il tuo codice risolve tipicamente:
| Servizio | Durata | Ruolo |
|---|---|---|
Viewer | Transient | Apri, chiudi, annotazioni, helper delle risorse — vedi Viewer |
DocumentConverter | Transient | Conversione — registrato solo con il plugin Converter |
IDoconutLicenseService | Singleton | La licenza caricata e le sue capacità — vedi Licensing |
DoconutOptions | Singleton | Le opzioni passate a Initialize |
HealthCheckService | Singleton | Esegue il controllo di integrità "doconut" (vedi sotto) |
Risolvi da DoconutHost.Services, mai da un contenitore tuo. Registrare Doconut in un altro contenitore crea un secondo, separato set di servizi che il gestore e il modulo non vedono: i documenti aperti tramite quel contenitore sono sconosciuti a DocImage.axd.
Arresta
// 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 ferma il lavoro in background di Doconut (usato nella modalità distribuita) e rilascia il contenitore. È sicuro chiamarlo due volte, e sicuro anche quando Initialize non è mai stato eseguito — ad esempio quando il pool di applicazioni si ricicla prima della prima richiesta.
Controllo di integrità
Doconut registra un controllo di integrità chiamato "doconut" che riporta lo stato della licenza. ASP.NET classico non ha un endpoint di health‑check proprio, quindi esponilo da un controller:
// 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");
}| Stato | Significato |
|---|---|
Healthy | È stata caricata una licenza valida |
Degraded | Versione di prova, o nessun file di licenza trovato |
Unhealthy | La licenza è scaduta |
I metodi di estensione ASP.NET Core
Il pacchetto contiene anche UseDoconut() e UseDoconutResources(), le estensioni della pipeline ASP.NET Core, perché condivide il codice con i pacchetti ASP.NET Core. In questo pacchetto entrambi sono contrassegnati [Obsolete] e non sono usati: un'applicazione System.Web non ha una pipeline di richieste a cui aggiungerli. I loro sostituti sono le due registrazioni in Web.config descritte in Installazione:
| ASP.NET Core | .NET Framework 4.7.2 |
|---|---|
builder.Services.AddDoconut(...) | DoconutHost.Initialize(...) in Application_Start |
app.UseDoconut() | Doconut.DocImageHandler su DocImage.axd in Web.config |
app.UseDoconutResources() | Doconut.DoconutResourceModule in Web.config |
| Iniezione del costruttore | DoconutHost.Services.GetRequiredService<T>() |
| Arresto dell'host | DoconutHost.Shutdown() in Application_End |
Questa pagina è stata utile?