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łonek | Cel |
|---|---|
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:
// 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();
});configureotrzymuje DoconutOptions: licencję, przełączniki bezpieczeństwa, wtyczki, widgety.configureServicesjest opcjonalny. Uruchamia się po zarejestrowaniu usług przez Doconut i przed zbudowaniem kontenera, więc może dodać usługi —AddDoconutDistributeddla 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:
// 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ługa | Czas życia | Rola |
|---|---|---|
Viewer | Przejściowa | Otwieranie, zamykanie, adnotacje, pomocniki zasobów — zobacz Viewer |
DocumentConverter | Przejściowa | Konwersja — zarejestrowana tylko z wtyczką Converter |
IDoconutLicenseService | Singleton | Załadowana licencja i jej możliwości — zobacz Licensing |
DoconutOptions | Singleton | Opcje przekazane do Initialize |
HealthCheckService | Singleton | Uruchamia 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
// 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:
// 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");
}| Stan | Znaczenie |
|---|---|
Healthy | Załadowano ważną licencję |
Degraded | Wersja próbna lub nie znaleziono pliku licencji |
Unhealthy | Licencja 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 konstruktor | DoconutHost.Services.GetRequiredService<T>() |
| Zamknięcie hosta | DoconutHost.Shutdown() w Application_End |
Czy ta strona była pomocna?