ASP.NET Core

Três chamadas de middleware, não uma reescrita

Doconut é registrado da mesma forma que tudo o mais no ASP.NET Core: um serviço no contêiner e middleware no pipeline. Ele herda sua autenticação, seu registro de logs, seu grafo DI e sua história de implantação, porque está sendo executado dentro deles e não ao lado.

3
chamadas de middleware para integrar
75
extensões de arquivo prontas para uso
2
alvos de implantação: Windows, Docker

O problema

O custo de integração que ninguém orça

A maioria dos visualizadores de documentos chega como um serviço separado. Isso significa uma segunda unidade de implantação, um segundo conjunto de credenciais, um salto de rede pelo qual seus documentos agora trafegam, e um segundo assunto para chamar alguém às 2h da manhã.

Doconut é uma biblioteca. AddDoconut() a coloca na sua coleção de serviços; UseDoconut() a coloca no seu pipeline. Ela roda sob a identidade do seu processo, vê sua configuração, grava no seu logger e é implantada por quem já implanta sua aplicação.

A consequência prática é que a autorização permanece onde deve estar. Você chama OpenDocumentAsync() após sua própria verificação de permissão, e o visualizador só pode renderizar o que você decidiu entregar a ele.

Capacidades

O que o middleware oferece

Razor Pages, MVC e APIs mínimas

O visualizador não está vinculado a um estilo de hospedagem. Renderize a div de montagem a partir de uma view Razor ou de uma página estática e abra o documento a partir de uma ação de controlador, um manipulador de página ou um endpoint mapeado.

Sua autenticação, inalterada

Como os endpoints vivem no seu pipeline, [Authorize] funciona como sempre. Não há um segundo sistema de identidade para federar.

Segurança de documento baseada em sessão

A segurança de documentos depende do estado de sessão do ASP.NET, por isso UseSession() deve ser registrado antes de UseDoconut(). Isso significa que a noção que o visualizador tem de quem você é é a mesma da aplicação.

Pronto para farm de web

Múltiplos nós atrás de um balanceador de carga compartilham o cache de renderização, de modo que uma sessão aberta em um nó continua funcionando quando a próxima requisição chega a outro.

Windows ou Docker

IIS, Kestrel ou uma imagem de contêiner que você mesmo constrói. Nada na integração muda entre eles, exceto onde o arquivo de licença é montado.

Conversão no mesmo pipeline

Com o plugin Converter, DocumentConverter.ConvertAsync() executa no mesmo processo — sem segundo serviço, sem upload temporário, sem ida e volta.

Integração

Registro e um endpoint aberto

UserMayRead e ResolvePath são seu próprio código. Esse é o ponto: Doconut nunca descobre quais documentos existem ou quem tem permissão para vê-los.

Plataformas suportadas

Razor PagesMVCMinimal APIs.NET 8.NET 6WindowsDocker
csharp
// Program.cs
builder.Services.AddDoconut(options =>
{
    options.LicensePath = "Doconut.Viewer.lic";
});
builder.Services.AddSession(); // document security rides on session state

var app = builder.Build();

app.UseSession();          // call UseSession() before UseDoconut()
app.UseDoconutResources(); // must be registered before UseDoconut()
app.UseDoconut();

// Open the document server-side, behind your own authorization
app.MapPost("/api/open", async (Viewer viewer, HttpContext ctx, string documentId) =>
{
    if (!await ctx.UserMayRead(documentId))
        return Results.Forbid();

    // The token is opaque — hand it to the widget, never log or persist it.
    string token = await viewer.OpenDocumentAsync(ResolvePath(documentId));
    return Results.Ok(new { token });
}).RequireAuthorization();

Detalhes

Ordem de registro e armadilhas

  • UseSession() deve ser chamado antes de UseDoconut(). A segurança de documentos depende disso.
  • UseDoconutResources() deve ser chamado antes de UseDoconut() e deve ficar atrás da mesma autenticação que o resto do aplicativo.
  • A view Razor injeta Doconut.Viewer e emite ReferenceCss / ReferenceScripts; o jQuery precisa ser carregado antes dos scripts do visualizador.
  • Defina options.LicensePath a partir da configuração para que o arquivo de licença possa ser montado como um segredo em vez de incorporado na imagem.

Perguntas frequentes

Ele funciona com .NET 6 assim como .NET 8?

Sim. Ambos são suportados e utilizam a mesma arquitetura DI + middleware. Existem páginas dedicadas para cada um, caso você precise de detalhes específicos por versão.

Existe um componente Razor ou um tag helper?

Não, e isso é intencional. A integração é sempre middleware mais o widget JavaScript, o que mantém a mesma integração válida em Razor Pages, MVC, Web Forms e Blazor, em vez de fragmentar em quatro.

Como ele se comporta atrás de um balanceador de carga?

Farm de web e implantação distribuída são suportados por meio de um cache de renderização compartilhado. Um documento aberto em um nó permanece legível quando requisições subsequentes chegam a outro.

Preciso do Office instalado no servidor?

Não. A renderização é nativa — não há interoperação com Office, nem Word sem interface, nem automação COM para cuidar.

Experimente com seus próprios documentos

Uma licença temporária leva alguns minutos para ser solicitada e funciona totalmente na sua própria máquina. Os arquivos que importam são os que já estão quebrando seu visualizador atual.