DoconutHost
Kořenová kompozice pro System.Web
DoconutHost (namespace Doconut) je statická třída, která vlastní služby Doconut pro celý pracovní proces. Aplikace ASP.NET Core vytvářejí tyto služby v kontejneru samotného frameworku; klasický ASP.NET nemá kontejner, takže DoconutHost vytvoří jeden a udržuje jej. Obslužný prvek DocImage.axd a modul zdrojů řeší vše, co potřebují, z něj, a tak činí i váš kód.
| Člen | Účel |
|---|---|
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null) | Vytváří služby — jednou |
static IServiceProvider Services { get; } | Vytvořený kontejner |
static bool IsInitialized { get; } | true jednou, když Initialize proběhne |
static void Shutdown() | Zastavuje práci na pozadí a uvolňuje kontejner |
Inicializace
Zavolejte ji z Application_Start v Global.asax.cs:
// Global.asax.cs, Application_Start – jednou na pracovní proces. Druhé volání je nečinné:
// volby prvního volání vítězí.
Doconut.DoconutHost.Initialize(
options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
},
services =>
{
// Volitelné. Spouští se po registracích Doconut's a před vytvořením kontejneru,
// takže může přidat služby nebo nahradit jednu Doconut registrovanou.
services.AddMemoryCache();
});configurepřijímá DoconutOptions: licence, bezpečnostní přepínače, pluginy, widgety.configureServicesje volitelný. Spouští se po tom, co Doconut zaregistroval své služby a před vytvořením kontejneru, takže může přidat služby —AddDoconutDistributedpro webfarm je obvyklý — nebo nahradit registraci, kterou Doconut provedl.
První volání vyhrává. Initialize je idempotentní: druhé volání vrátí okamžitě, a žádný z jeho delegátů se nespustí. To udržuje duplicitní Application_Start neškodné, ale také to znamená, že konfiguraci nelze změnit opětovným voláním Initialize — místo toho recyklujte aplikační pool.
Výjimka vyvolaná zde — plugin bez licence, neplatné možnosti, neúplná konfigurace farmy — nastane uvnitř Application_Start. ASP.NET pak odpovídá na každý požadavek prázdným 500 a výjimka je zaznamenána pouze v protokolu událostí Windows (protokol aplikace, zdroj ASP.NET).
Služby a IsInitialized
System.Web nemá injekci konstruktoru pro controllery, stránky nebo handlery, takže služby Doconut řešte tam, kde je používáte:
// System.Web nemá injekci přes konstruktor: řešte služby Doconut tam, kde je používáte.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
// Zaregistrováno pouze když je plugin Converter (viz stránka pluginu).
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();Services vyvolá InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.), když je čteno před Initialize. Kód, který může běžet dříve — modul, statický konstruktor — může nejprve zkontrolovat IsInitialized.
Co váš kód typicky řeší:
| Služba | Životnost | Role |
|---|---|---|
Viewer | Přechodná | Otevření, zavření, anotace, pomocníci zdrojů — viz Prohlížeč |
DocumentConverter | Přechodná | Konverze — registrována pouze s pluginem Converter |
IDoconutLicenseService | Singleton | Načtená licence a její schopnosti — viz Licencování |
DoconutOptions | Singleton | Možnosti předané Initialize |
HealthCheckService | Singleton | Spouští kontrolu zdraví "doconut" (dále) |
Řešte z DoconutHost.Services, nikdy ne z vlastního kontejneru. Registrace Doconut do jiného kontejneru vytvoří druhou, oddělenou sadu služeb, kterou handler a modul nikdy nevidí: dokumenty otevřené přes něj jsou neznámé DocImage.axd.
Ukončení
// Global.asax.cs, Application_End – zastavuje práci na pozadí a uvolňuje kontejner.
// Bezpečné volat dvakrát a bezpečné, když Initialize nikdy neběžel.
Doconut.DoconutHost.Shutdown();Shutdown zastavuje práci Doconut na pozadí (používanou distribuovaným režimem) a uvolňuje kontejner. Je bezpečné volat dvakrát a je bezpečné, když Initialize nikdy neběžel — například když se aplikační pool recykluje před prvním požadavkem.
Kontrola zdraví
Doconut registruje kontrolu zdraví nazvanou "doconut", která hlásí stav licence. Klasický ASP.NET nemá vlastní koncový bod pro kontrolu zdraví, takže ji vystavte z řadiče:
// GET /Health – Doconut registruje health check "doconut", který hlásí stav licence:
// Zdravý (platný), Degradovaný (zkušební nebo chybí licenční soubor), Nezdravý (vypršel).
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");
}| Stav | Význam |
|---|---|
Healthy | Platná licence je načtena |
Degraded | Zkušební verze, nebo nebyl nalezen soubor licence |
Unhealthy | Licence vypršela |
Rozšíření ASP.NET Core
Balíček také obsahuje UseDoconut() a UseDoconutResources(), rozšíření pipeline ASP.NET Core, protože sdílí svůj kód s balíčky ASP.NET Core. V tomto balíčku jsou oba označeny jako [Obsolete] a nejsou použity: aplikace System.Web nemá žádný požadavek pipeline, do kterého by je šlo přidat. Jejich náhradou jsou dvě registrace Web.config z Instalace:
| ASP.NET Core | .NET Framework 4.7.2 |
|---|---|
builder.Services.AddDoconut(...) | DoconutHost.Initialize(...) v Application_Start |
app.UseDoconut() | Doconut.DocImageHandler na DocImage.axd v Web.config |
app.UseDoconutResources() | Doconut.DoconutResourceModule v Web.config |
| Injekce konstruktoru | DoconutHost.Services.GetRequiredService<T>() |
| Ukončení hosta | DoconutHost.Shutdown() v Application_End |
Byla tato stránka užitečná?