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.

MembroPropó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:

csharp
// 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();
    });
  • configure recebe 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 — AddDoconutDistributed para 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:

csharp
// 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çoTempo de vidaFunção
ViewerTransientAbrir, fechar, anotações, auxiliares de recursos — veja Viewer
DocumentConverterTransientConversão — registrado apenas com o plugin Converter
IDoconutLicenseServiceSingletonA licença carregada e suas capacidades — veja Licenciamento
DoconutOptionsSingletonAs opções passadas para Initialize
HealthCheckServiceSingletonExecuta 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

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

csharp
// 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");
}
StatusSignificado
HealthyUma licença válida está carregada
DegradedAvaliação (trial) ou nenhum arquivo de licença encontrado
UnhealthyA 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 construtorDoconutHost.Services.GetRequiredService<T>()
Desligamento do hostDoconutHost.Shutdown() em Application_End

Esta página foi útil?