DoconutHost

Le point d'entrée de composition pour System.Web

DoconutHost (namespace Doconut) est une classe statique qui possède les services de Doconut pour l'ensemble du processus de travail. Les applications ASP.NET Core intègrent ces services dans le conteneur propre du framework ; le ASP.NET classique n'a pas de conteneur, donc DoconutHost en crée un et le conserve. Le gestionnaire DocImage.axd et le module de ressources résolvent tout ce dont ils ont besoin à partir de celui‑ci, tout comme votre code.

MembreObjectif
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null)Construit les services — une fois
static IServiceProvider Services { get; }Le conteneur construit
static bool IsInitialized { get; }true une fois que Initialize a été exécuté
static void Shutdown()Arrête le travail en arrière‑plan et libère le conteneur

Initialiser

Appelez‑le depuis Application_Start dans Global.asax.cs :

csharp
// Global.asax.cs, Application_Start - une fois par processus de travail. Un deuxième appel est un no-op :
// les options du premier appel l'emportent.
Doconut.DoconutHost.Initialize(
    options =>
    {
        options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
    },
    services =>
    {
        // Optionnel. S'exécute après les enregistrements propres de Doconut et avant que le conteneur ne soit construit,
        // afin qu'il puisse ajouter des services ou remplacer un service enregistré par Doconut.
        services.AddMemoryCache();
    });
  • configure reçoit le DoconutOptions : licence, commutateurs de sécurité, plugins, widgets.
  • configureServices est optionnel. Il s'exécute après que Doconut a enregistré ses propres services et avant que le conteneur ne soit construit, il peut donc ajouter des services — AddDoconutDistributed pour une ferme web est le plus courant — ou remplacer un enregistrement effectué par Doconut.

Le premier appel l'emporte. Initialize est idempotent : un second appel retourne immédiatement, et aucun de ses délégués ne s'exécute. Cela rend un Application_Start dupliqué inoffensif, mais cela signifie aussi que la configuration ne peut pas être modifiée en rappelant Initialize — recyclez le pool d'applications à la place.

Une exception levée ici — un plugin sans licence, des options invalides, une configuration de ferme incomplète — se produit à l'intérieur de Application_Start. ASP.NET répond alors à chaque requête avec un 500 vide, et l'exception n'est enregistrée que dans le journal d'événements Windows (journal Application, source ASP.NET).

Services et IsInitialized

System.Web ne propose pas d'injection de constructeur pour les contrôleurs, les pages ou les gestionnaires, donc résolvez les services de Doconut là où vous les utilisez :

csharp
// System.Web ne supporte pas l'injection de constructeur : résolvez les services Doconut là où vous les utilisez.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();

// Enregistré uniquement lorsque le plugin Converter est (voir la page du plugin).
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();

Services lève InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) lorsqu'il est lu avant Initialize. Le code qui peut s'exécuter plus tôt — un module, un constructeur statique — peut vérifier IsInitialized d'abord.

Ce que votre code résout généralement :

ServiceDurée de vieRôle
ViewerTransitoireOuvrir, fermer, annotations, aides de ressources — voir Viewer
DocumentConverterTransitoireConversion — enregistré uniquement avec le plugin Converter
IDoconutLicenseServiceSingletonLa licence chargée et ses capacités — voir Licensing
DoconutOptionsSingletonLes options transmises à Initialize
HealthCheckServiceSingletonExécute le contrôle de santé "doconut" (ci‑dessous)

Résolvez depuis DoconutHost.Services, jamais depuis votre propre conteneur. Enregistrer Doconut dans un autre conteneur crée un deuxième ensemble de services séparé que le gestionnaire et le module ne voient jamais : les documents ouverts via celui‑ci sont inconnus de DocImage.axd.

Arrêt

csharp
// Global.asax.cs, Application_End - arrête le travail en arrière-plan et libère le conteneur.
// Sûr d'appeler deux fois, et sûr lorsque Initialize n'a jamais été exécuté.
Doconut.DoconutHost.Shutdown();

Shutdown arrête le travail en arrière‑plan de Doconut (utilisé par le mode distribué) et libère le conteneur. Il est sûr de l'appeler deux fois, et sûr lorsque Initialize ne s'est jamais exécuté — par exemple lorsque le pool d'applications se recycle avant la première requête.

Contrôle de santé

Doconut enregistre un contrôle de santé nommé "doconut" qui rapporte l'état de la licence. Le ASP.NET classique n'a pas de point de terminaison de contrôle de santé propre, donc exposez‑le depuis un contrôleur :

csharp
// GET /Health - Doconut enregistre un contrôle de santé "doconut" qui rapporte l'état de la licence :
// Sain (valide), Dégradé (essai ou aucun fichier de licence), Insalubre (expiré).
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");
}
StatutSignification
HealthyUne licence valide est chargée
DegradedEssai, ou aucun fichier de licence trouvé
UnhealthyLa licence a expiré

Les méthodes d'extension ASP.NET Core

Le paquet contient également UseDoconut() et UseDoconutResources(), les extensions du pipeline ASP.NET Core, car il partage son code avec les paquets ASP.NET Core. Dans ce paquet, les deux sont marqués [Obsolete] et ne sont pas utilisés : une application System.Web n'a pas de pipeline de requêtes auquel les ajouter. Leurs remplacements sont les deux enregistrements Web.config provenant de 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

Cette page était-elle utile ?