DoconutHost
Kompositionsroten för System.Web
DoconutHost (namespace Doconut) är en statisk klass som äger Doconut's tjänster för hela arbetsprocessen. ASP.NET Core-applikationer bygger dessa tjänster i ramverkets egen behållare; klassisk ASP.NET har ingen behållare, så DoconutHost bygger en och behåller den. DocImage.axd-hanteraren och resursmodulen löser allt de behöver från den, och det gör även din kod.
| Medlem | Syfte |
|---|---|
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null) | Bygger tjänsterna — en gång |
static IServiceProvider Services { get; } | Den byggda behållaren |
static bool IsInitialized { get; } | true en gång när Initialize har körts |
static void Shutdown() | Stoppar bakgrundsarbete och frigör behållaren |
Initiera
Anropa den från Application_Start i Global.asax.cs:
// Global.asax.cs, Application_Start - en gång per arbetsprocess. Ett andra anrop är en ingen‑operation:
// det första anropets alternativ vinner.
Doconut.DoconutHost.Initialize(
options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
},
services =>
{
// Valfritt. Körs efter Doconut's egna registreringar och innan containern byggs,
// så att den kan lägga till tjänster eller ersätta en som Doconut registrerat.
services.AddMemoryCache();
});configuretar emot DoconutOptions: licens, säkerhetsväxlar, plugins, widgets.configureServicesär valfri. Den körs efter att Doconut har registrerat sina egna tjänster och innan behållaren byggs, så den kan lägga till tjänster —AddDoconutDistributedför en webbfarm är den vanliga — eller ersätta en registrering som Doconut gjort.
Det första anropet vinner. Initialize är idempotent: ett andra anrop returnerar omedelbart, och ingen av dess delegater körs. Det gör en duplicerad Application_Start ofarlig, men det betyder också att konfigurationen inte kan ändras genom att anropa Initialize igen — återanvänd applikationspoolen istället.
Ett undantag som kastas här — ett plugin utan licens, ogiltiga alternativ, en ofullständig farmkonfiguration — inträffar inuti Application_Start. ASP.NET svarar då på varje begäran med en tom 500, och undantaget registreras endast i Windows händelseloggen (Applikationslogg, källa ASP.NET).
Tjänster och IsInitialized
System.Web har ingen konstruktorinjektion för kontroller, sidor eller hanterare, så lös upp Doconut's tjänster där du använder dem:
// System.Web har ingen konstruktor‑injektion: lös upp Doconut‑tjänster där du använder dem.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
// Registrerad endast när Converter‑pluginet är (se pluginsidan).
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();Services kastar InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) när den läses innan Initialize. Kod som kan köras tidigare — en modul, en statisk konstruktor — kan kontrollera IsInitialized först.
Vad din kod vanligtvis löser upp:
| Tjänst | Livstid | Roll |
|---|---|---|
Viewer | Transient | Öppna, stäng, annotationer, resurshjälpare — se Viewer |
DocumentConverter | Transient | Konvertering — registrerad endast med Converter‑pluginet |
IDoconutLicenseService | Singleton | Den laddade licensen och dess funktioner — se Licensing |
DoconutOptions | Singleton | Alternativen som skickas till Initialize |
HealthCheckService | Singleton | Kör "doconut"-hälsokontrollen (nedan) |
Lös upp från DoconutHost.Services, aldrig från en egen behållare. Att registrera Doconut i en annan behållare bygger ett andra, separat uppsättning tjänster som hanteraren och modulen aldrig ser: dokument som öppnas genom den är okända för DocImage.axd.
Avstängning
// Global.asax.cs, Application_End - stoppar bakgrundsarbete och disponerar containern.
// Säker att anropa två gånger, och säker när Initialize aldrig kördes.
Doconut.DoconutHost.Shutdown();Shutdown stoppar Doconut's bakgrundsarbete (används av distribuerat läge) och frigör behållaren. Det är säkert att anropa två gånger, och säkert när Initialize aldrig har körts — till exempel när applikationspoolen återanvänds innan den första begäran.
Hälsokontroll
Doconut registrerar en hälsokontroll med namnet "doconut" som rapporterar licenstillståndet. Klassisk ASP.NET har ingen egen hälsokontrollslutpunkt, så exponera den från en kontroller:
// GET /Health - Doconut registrerar en "doconut" hälsokontroll som rapporterar licenstillståndet:
// Frisk (giltig), Nedsatt (prövning eller ingen licensfil), Ohälsosam (utgången).
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");
}| Status | Betydelse |
|---|---|
Healthy | En giltig licens har laddats |
Degraded | Provversion, eller ingen licensfil hittades |
Unhealthy | Licensen har gått ut |
ASP.NET Core-utökningarna
Paketet innehåller också UseDoconut() och UseDoconutResources(), ASP.NET Core-pipeline‑utökningarna, eftersom det delar sin kod med ASP.NET Core-paketen. I detta paket är båda markerade [Obsolete] och används inte: en System.Web-applikation har ingen begäranpipeline att lägga till dem i. Deras ersättningar är de två Web.config-registreringarna från 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 |
| Konstruktorinjektion | DoconutHost.Services.GetRequiredService<T>() |
| Värdavstängning | DoconutHost.Shutdown() in Application_End |
Var den här sidan hjälpsam?