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.

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

csharp
// 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();
    });
  • configure tar 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 — AddDoconutDistributed fö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:

csharp
// 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änstLivstidRoll
ViewerTransientÖppna, stäng, annotationer, resurshjälpare — se Viewer
DocumentConverterTransientKonvertering — registrerad endast med Converter‑pluginet
IDoconutLicenseServiceSingletonDen laddade licensen och dess funktioner — se Licensing
DoconutOptionsSingletonAlternativen som skickas till Initialize
HealthCheckServiceSingletonKö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

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

csharp
// 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");
}
StatusBetydelse
HealthyEn giltig licens har laddats
DegradedProvversion, eller ingen licensfil hittades
UnhealthyLicensen 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
KonstruktorinjektionDoconutHost.Services.GetRequiredService<T>()
VärdavstängningDoconutHost.Shutdown() in Application_End

Var den här sidan hjälpsam?