DoconutExtensions

Registro de serviços e middleware

DoconutExtensions (namespace Doconut.Middleware) é a classe estática com as três chamadas que todo host Doconut faz: um registro de serviço e duas registragens de middleware.

csharp
builder.Services.AddDoconut(options => { /* … */ });
// …
app.UseDoconutResources(); // ANTES UseDoconut()
app.UseDoconut();

AddDoconut

text
IServiceCollection AddDoconut(this IServiceCollection services, Action<DoconutOptions>? configure = null)

Constrói o DoconutOptions, valida‑os de forma fail-fast (veja DoconutOptions → validação de inicialização), e registra o grafo completo de serviços:

ServiçoTempo de VidaFunção
DoconutOptionsSingletonO objeto de configuração
Servidor de cache de sessãoSingletonToken → cache de sessão (IMemoryCache também está registrado)
IDoconutLicenseServiceSingletonLicença carregada uma vez na inicialização (precedência: LicenseStream → LicenseContent → LicensePath → busca automática)
Pipeline de página‑imagemSingletonExecuta processamento de imagem para páginas (marca d'água, rotação, escala, anotações)
Segurança de documento (armazenamento de acesso)SingletonConcessões para vinculação token‑sessão
ViewerTransientA fachada pública de abrir/fechar
DocumentConverterTransientFachada de conversão — requer o plugin Converter
DistributedDocumentPublisher—Publica os artefatos de um documento no armazenamento compartilhado
Verificação de saúde "doconut"—Reporta o estado de licença/vencimento através das verificações de saúde do ASP.NET

Não há chamada equivalente na biblioteca .NET Standard anterior. Ela construía new Viewer(cache, accessor) por requisição e passava opções para o middleware; ambos são substituídos por este único registro.

Dois comportamentos que vale a pena conhecer:

  • Converter requer seu plugin. Resolver DocumentConverter sem options.AddPlugin<ConverterPlugin>() lança:
text
InvalidOperationException: No IDocumentConverter is registered. Add the converter plugin: options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>().
  • A elegibilidade do plugin é validada na inicialização. Uma licença ausente, arquivo legado TRIAL, ou licença paga sem a capacidade de plugin registrada falha no momento AddDoconut(). Registros Temporários/Demo sobrevivem à sua data de expiração, enquanto os portões de tempo de execução revogam as capacidades expiradas.

A verificação de saúde integra‑se ao mecanismo padrão do ASP.NET Core — mapeie‑a se quiser o estado da licença no seu endpoint de saúde:

csharp
app.MapHealthChecks("/health");

UseDoconut

text
IApplicationBuilder UseDoconut(this IApplicationBuilder app)

Adiciona o middleware de página‑imagem Doconut. Ele responde a toda requisição que contém um parâmetro de consulta ?token= — páginas, miniaturas, busca, anotações, ações de página (a tabela completa de requisições está em Conceitos Principais → Como o Visualizador Funciona). Quando UnsafeMode está false, a camada de segurança de documento é conectada automaticamente antes dele.

Não recebe argumentos. Passar uma instância DoconutOptions aqui era o formato da biblioteca anterior e não compila mais.

O exemplo de referência encaminha as requisições do widget através de um ramo de caminho, mantendo o formato histórico da requisição:

csharp
app.MapWhen(
    ctx => ctx.Request.Path.Value?.EndsWith("DocImage.axd", StringComparison.OrdinalIgnoreCase) == true,
    branch => branch.UseDoconut());

UseDoconutResources

text
IApplicationBuilder UseDoconutResources(this IApplicationBuilder app)

Serve o JS, CSS, imagens e fontes incorporados em DoconutOptions.ResourcesPath (padrão /doconut-res). Estes são os arquivos para os quais Viewer.ReferenceCss() / ReferenceScripts() emitem tags.

Sempre chame antes de UseDoconut(). Se a área do visualizador permanecer vazia e o console do navegador mostrar 404s para /doconut-res/..., esta chamada está ausente ou fora de lugar.

Esta é a substituição suportada para conectar manualmente o middleware de tratamento de recursos incorporados.

Serving from shared storage

Existem duas registragens adicionais para implantações onde o nó que renderiza um documento não é necessariamente o nó que serve suas páginas. Ambas são cobertas de ponta a ponta em Implantações Distribuídas; as assinaturas são:

text
IServiceCollection AddDoconutDistributedAsyncPublish(...)   // fila de publicação em segundo plano opt-in
IServiceCollection AddDoconutDistributedWidgets(...)        // armazenamento de apoio compartilhado para uploads de widget

O lado de leitura é um middleware separado do pacote Doconut.Clouds:

text
IApplicationBuilder UseDoconutCloud<THandler>(
    this IApplicationBuilder app,
    Action<CloudOptions>? configure = null,
    string pathPrefix = "/doconut-cloud")
    where THandler : BaseCloudHandler

UseDoconutWebFarm(...) e WebFarmOptions não existem nesta versão. Veja o guia de migração para o mapeamento configuração por configuração.

Ordering recap

csharp
app.UseRouting();
app.UseSession();          // necessário quando UnsafeMode = false
app.UseDoconutResources(); // 1ª chamada Doconut
app.UseDoconut();          // 2ª chamada Doconut (ou via um ramo MapWhen)

Esta página foi útil?