DoconutHost

Główny punkt kompozycji dla System.Web

DoconutHost (namespace Doconut) jest statyczną klasą, która zarządza usługami Doconut dla całego procesu roboczego. Aplikacje ASP.NET Core budują te usługi w własnym kontenerze frameworka; klasyczny ASP.NET nie ma kontenera, więc DoconutHost tworzy go i utrzymuje. Obsługa DocImage.axd oraz moduł zasobów rozwiązują wszystko, czego potrzebują, z tego kontenera, podobnie jak Twój kod.

CzłonekCel
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null)Tworzy usługi — raz
static IServiceProvider Services { get; }Zbudowany kontener
static bool IsInitialized { get; }true raz po uruchomieniu Initialize
static void Shutdown()Zatrzymuje pracę w tle i zwalnia kontener

Inicjalizacja

Wywołaj to z Application_Start w Global.asax.cs:

csharp
// Global.asax.cs, Application_Start - raz na proces roboczy. Drugie wywołanie nie robi nic:
// opcje pierwszego wywołania wygrywają.
Doconut.DoconutHost.Initialize(
    options =>
    {
        options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
    },
    services =>
    {
        // Opcjonalne. Uruchamiane po własnych rejestracjach Doconut i przed zbudowaniem kontenera,
        // dlatego może dodać usługi lub zastąpić jedną zarejestrowaną przez Doconut.
        services.AddMemoryCache();
    });
  • configure otrzymuje DoconutOptions: licencję, przełączniki bezpieczeństwa, wtyczki, widgety.
  • configureServices jest opcjonalny. Uruchamia się po zarejestrowaniu usług przez Doconut i przed zbudowaniem kontenera, więc może dodać usługi — AddDoconutDistributed dla farmy webowej jest typowy — lub zastąpić rejestrację wykonaną przez Doconut.

Pierwsze wywołanie wygrywa. Initialize jest idempotentny: drugie wywołanie zwraca natychmiast, a żaden z jego delegatów nie zostaje uruchomiony. To sprawia, że zduplikowany Application_Start jest nieszkodliwy, ale oznacza też, że konfiguracji nie można zmienić, wywołując ponownie Initialize — zamiast tego zresetuj pulę aplikacji.

Wyjątek rzucony w tym miejscu — wtyczka bez licencji, nieprawidłowe opcje, niekompletna konfiguracja farmy — występuje wewnątrz Application_Start. ASP.NET odpowiada wtedy na każde żądanie pustym 500, a wyjątek jest zapisywany wyłącznie w dzienniku zdarzeń Windows (log aplikacji, źródło ASP.NET).

Usługi i IsInitialized

System.Web nie posiada wstrzykiwania przez konstruktor dla kontrolerów, stron ani obsługujących, więc rozwiązuj usługi Doconut tam, gdzie ich używasz:

csharp
// System.Web nie obsługuje wstrzykiwania przez konstruktor: rozwiąż usługi Doconut tam, gdzie ich używasz.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();

// Rejestrowane tylko wtedy, gdy wtyczka Converter jest (zobacz stronę wtyczki).
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();

Services rzuca InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) gdy odczytane przed Initialize. Kod, który może uruchomić się wcześniej — moduł, statyczny konstruktor — może najpierw sprawdzić IsInitialized.

Co Twój kod zazwyczaj rozwiązuje:

UsługaCzas życiaRola
ViewerPrzejściowaOtwieranie, zamykanie, adnotacje, pomocniki zasobów — zobacz Viewer
DocumentConverterPrzejściowaKonwersja — zarejestrowana tylko z wtyczką Converter
IDoconutLicenseServiceSingletonZaładowana licencja i jej możliwości — zobacz Licensing
DoconutOptionsSingletonOpcje przekazane do Initialize
HealthCheckServiceSingletonUruchamia sprawdzenie stanu zdrowia "doconut" (poniżej)

Rozwiązuj z DoconutHost.Services, nigdy nie z własnego kontenera. Rejestrowanie Doconut w innym kontenerze tworzy drugi, oddzielny zestaw usług, którego obsługa i moduł nigdy nie widzą: dokumenty otwarte przez niego są nieznane DocImage.axd.

Zamknięcie

csharp
// Global.asax.cs, Application_End - zatrzymuje pracę w tle i zwalnia kontener.
// Bezpieczne przy dwukrotnym wywołaniu i gdy Initialize nigdy nie zostało uruchomione.
Doconut.DoconutHost.Shutdown();

Shutdown zatrzymuje pracę w tle Doconut (używaną w trybie rozproszonym) i zwalnia kontener. Bezpieczne jest wywołanie dwukrotnie oraz gdy Initialize nigdy nie został uruchomiony — na przykład gdy pula aplikacji jest resetowana przed pierwszym żądaniem.

Sprawdzenie stanu zdrowia

Doconut rejestruje sprawdzenie stanu zdrowia o nazwie "doconut", które raportuje stan licencji. Klasyczny ASP.NET nie ma własnego punktu końcowego sprawdzania stanu zdrowia, więc udostępnij go z kontrolera:

csharp
// GET /Health - Doconut rejestruje kontrolę zdrowia "doconut", która raportuje stan licencji:
// Zdrowy (ważny), Pogorszony (wersja próbna lub brak pliku licencji), Niezdrowy (przeterminowany).
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");
}
StanZnaczenie
HealthyZaładowano ważną licencję
DegradedWersja próbna lub nie znaleziono pliku licencji
UnhealthyLicencja wygasła

Metody rozszerzeń ASP.NET Core

Pakiet zawiera także UseDoconut() i UseDoconutResources(), rozszerzenia potoku ASP.NET Core, ponieważ współdzieli kod z pakietami ASP.NET Core. W tym pakiecie oba są oznaczone jako [Obsolete] i nie są używane: aplikacja System.Web nie ma potoku żądań, do którego można je dodać. Ich zamienniki to dwa rejestracje Web.config z Installation:

ASP.NET Core.NET Framework 4.7.2
builder.Services.AddDoconut(...)DoconutHost.Initialize(...) w Application_Start
app.UseDoconut()Doconut.DocImageHandler na DocImage.axd w Web.config
app.UseDoconutResources()Doconut.DoconutResourceModule w Web.config
Wstrzykiwanie przez konstruktorDoconutHost.Services.GetRequiredService<T>()
Zamknięcie hostaDoconutHost.Shutdown() w Application_End

Czy ta strona była pomocna?