DoconutHost
A raiz de composição para System.Web
DoconutHost (namespace Doconut) é uma classe estática que possui os serviços do Doconut para todo o processo de trabalho. Aplicações ASP.NET Core constroem esses serviços no próprio contêiner do framework; o ASP.NET clássico não tem contêiner, então DoconutHost cria um e o mantém. O manipulador DocImage.axd e o módulo de recursos resolvem tudo o que precisam a partir dele, assim como o seu código.
| Membro | Propósito |
|---|---|
static void Initialize(Action<DoconutOptions>? configure = null, Action<IServiceCollection>? configureServices = null) | Constrói os serviços — uma única vez |
static IServiceProvider Services { get; } | O contêiner construído |
static bool IsInitialized { get; } | true assim que Initialize for executado |
static void Shutdown() | Interrompe o trabalho em segundo plano e descarta o contêiner |
Inicializar
Chame-a a partir de Application_Start em Global.asax.cs:
// Global.asax.cs, Application_Start - once per worker process. A second call is a no-op:
// the first call's options win.
Doconut.DoconutHost.Initialize(
options =>
{
options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
},
services =>
{
// Optional. Runs after Doconut's own registrations and before the container is built,
// so it can add services or replace one Doconut registered.
services.AddMemoryCache();
});configurerecebe o DoconutOptions: licença, interruptores de segurança, plugins, widgets.configureServicesé opcional. Ele é executado após o Doconut registrar seus próprios serviços e antes de o contêiner ser construído, podendo adicionar serviços —AddDoconutDistributedpara uma fazenda web é o usual — ou substituir um registro feito pelo Doconut.
A primeira chamada prevalece. Initialize é idempotente: uma segunda chamada retorna imediatamente, e nenhum de seus delegados é executado. Isso mantém um Application_Start duplicado inofensivo, mas também significa que a configuração não pode ser alterada chamando Initialize novamente — recicle o pool de aplicativos em vez disso.
Uma exceção lançada aqui — um plugin sem licença, opções inválidas, uma configuração de fazenda incompleta — ocorre dentro de Application_Start. O ASP.NET então responde a cada requisição com um 500 vazio, e a exceção é registrada apenas no log de eventos do Windows (log de Aplicação, origem ASP.NET).
Serviços e IsInitialized
System.Web não possui injeção por construtor para controladores, páginas ou manipuladores, portanto resolva os serviços do Doconut onde você os utiliza:
// System.Web has no constructor injection: resolve Doconut services where you use them.
var viewer = Doconut.DoconutHost.Services.GetRequiredService<Viewer>();
// Registered only when the Converter plugin is (see the plugin page).
var converter = Doconut.DoconutHost.Services.GetRequiredService<DocumentConverter>();Services lança InvalidOperationException (DoconutHost.Initialize must be called in Application_Start (Global.asax) before any Doconut request is served.) quando lido antes de Initialize. Código que pode ser executado antes — um módulo, um construtor estático — pode verificar IsInitialized primeiro.
O que seu código normalmente resolve:
| Serviço | Tempo de vida | Função |
|---|---|---|
Viewer | Transient | Abrir, fechar, anotações, auxiliares de recursos — veja Viewer |
DocumentConverter | Transient | Conversão — registrado apenas com o plugin Converter |
IDoconutLicenseService | Singleton | A licença carregada e suas capacidades — veja Licenciamento |
DoconutOptions | Singleton | As opções passadas para Initialize |
HealthCheckService | Singleton | Executa a verificação de integridade "doconut" (abaixo) |
Resolva a partir de DoconutHost.Services, nunca de um contêiner próprio. Registrar o Doconut em outro contêiner cria um segundo conjunto de serviços separado que o manipulador e o módulo nunca veem: documentos abertos através dele são desconhecidos para DocImage.axd.
Desligamento
// Global.asax.cs, Application_End - stops background work and disposes the container.
// Safe to call twice, and safe when Initialize never ran.
Doconut.DoconutHost.Shutdown();Shutdown interrompe o trabalho em segundo plano do Doconut (usado no modo distribuído) e descarta o contêiner. É seguro chamar duas vezes, e seguro quando Initialize nunca foi executado — por exemplo quando o pool de aplicativos recicla antes da primeira requisição.
Verificação de integridade
Doconut registra uma verificação de integridade chamada "doconut" que relata o estado da licença. O ASP.NET clássico não possui um endpoint de verificação de integridade próprio, então exponha-a a partir de um controlador:
// GET /Health - Doconut registers a "doconut" health check that reports the license state:
// Healthy (valid), Degraded (trial or no license file), Unhealthy (expired).
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 | Significado |
|---|---|
Healthy | Uma licença válida está carregada |
Degraded | Avaliação (trial) ou nenhum arquivo de licença encontrado |
Unhealthy | A licença expirou |
Os métodos de extensão do ASP.NET Core
O pacote também contém UseDoconut() e UseDoconutResources(), as extensões de pipeline do ASP.NET Core, porque compartilha seu código com os pacotes do ASP.NET Core. Neste pacote ambos estão marcados como [Obsolete] e não são usados: uma aplicação System.Web não possui pipeline de requisição ao qual adicioná-los. Seus substitutos são os dois registros no Web.config de Instalação:
| ASP.NET Core | .NET Framework 4.7.2 |
|---|---|
builder.Services.AddDoconut(...) | DoconutHost.Initialize(...) em Application_Start |
app.UseDoconut() | Doconut.DocImageHandler em DocImage.axd no Web.config |
app.UseDoconutResources() | Doconut.DoconutResourceModule no Web.config |
| Injeção por construtor | DoconutHost.Services.GetRequiredService<T>() |
| Desligamento do host | DoconutHost.Shutdown() em Application_End |
Esta página foi útil?