
Crie um Visualizador Seguro de Gerenciamento de Documentos em .NET com Doconut
Implementando Gerenciamento de Documentos com Doconut
Um fluxo de gerenciamento de documentos em um portal .NET geralmente precisa de três coisas:
- Uma maneira de carregar PDFs, arquivos Office, desenhos CAD ou imagens sem precisar escrever um visualizador do zero.
- Um token seguro que vincula o documento carregado à sessão atual do navegador.
- Uma etapa de limpeza que libera a memória assim que o usuário termina.
Doconut fornece tudo isso através de um único serviço Viewer, uma sessão IMemoryCache leve e chamadas explícitas CloseDocument.
1. Registre o visualizador no contêiner DI
Durante a inicialização da aplicação, adicione os serviços Doconut ao contêiner DI chamando o método de registro Doconut descrito na documentação oficial. Esta etapa registra o visualizador, o gerenciamento de licenças e o cache em memória que armazenará as sessões de documentos.
O registro valida a licença na inicialização, portanto qualquer licença ausente ou inválida falha rapidamente e você conhece o problema antes que a primeira solicitação atinja o servidor.
2. Insira o middleware que serve imagens de página, miniaturas e dados de anotação
Configure o middleware Doconut no pipeline de requisições para que qualquer solicitação contendo uma string de consulta ?token= seja tratada pelo Doconut. O middleware aplica o marcador de segurança padrão (secure-{token}) quando UnsafeMode é falso (o padrão) e serve imagens de página, miniaturas e dados de anotação.
Colocar o middleware em um ramo dedicado mantém o resto do seu pipeline intacto e permite escalonamento horizontal sem sessões persistentes.
3. Abra um documento e obtenha o token de sessão opaco
Crie um único endpoint que receba um caminho de arquivo (ou um stream) e retorne o token. O token é a única credencial que o widget cliente vê.
app.MapPost("/api/open", async (Viewer viewer) =>
{
// O token é opaco — entregue‑o ao widget, nunca registre ou persista‑o.
string token = await viewer.OpenDocumentAsync("wwwroot/files/Contract.pdf");
return Results.Ok(new { token });
});
O que acontece dentro de OpenDocumentAsync
- Portão de licença – uma licença inválida lança
LicenseExceptionimediatamente. - Criação de sessão – Doconut seleciona o visualizador de formato correto (PDF, Word, DWG, …) e armazena o motor em
IMemoryCachesob um token GUID. - Registro de segurança – com
UnsafeMode = falseo token é vinculado à sessão ASP.NET do chamador via um marcadorsecure-{token}. Apenas essa sessão do navegador pode solicitar páginas. - Retorno do token – o cliente recebe o token e o usa em todas as solicitações subsequentes (
/DocImage.axd?token=…).
A expiração deslizante padrão é de 60 minutos (configurável via DocOptions.TimeOut). Cada solicitação de página reinicia o relógio, de modo que sessões ociosas desaparecem automaticamente.
4. Renderize o documento no lado do cliente
Do navegador, você chama o endpoint, obtém o token e o entrega ao widget Doconut:
fetch('/api/open', { method: 'POST' })
.then(r => r.json())
.then(d => {
const token = d.token;
objViewer.View(token); // JavaScript widget fornecido pela Doconut
});
O widget internamente emite solicitações de página, miniatura, pesquisa e anotação que todas incluem o mesmo token. Como o token está vinculado à sessão no lado do servidor, um usuário malicioso não pode sequestrar o documento de outro usuário.
5. Feche o documento assim que o usuário sair do visualizador
Para PDFs ou arquivos CAD grandes, você deve liberar o motor de renderização imediatamente. Chame CloseDocument a partir de um endpoint no lado do servidor ou do evento “unload” do widget.
// Endpoint do lado do servidor
app.MapPost("/api/close", (Viewer viewer, string token) =>
{
viewer.CloseDocument(token);
return Results.Ok();
});
// Chamada direta do widget (se você expor o token ao backend)
viewer.CloseDocument(token);
CloseDocument remove a sessão do cache, descarta o motor de documento subjacente, exclui o marcador secure-{token} e revoga a concessão de acesso. A expiração deslizante acabaria fazendo o mesmo, mas um fechamento explícito garante que a memória seja recuperada no instante em que o usuário termina.
6. Opcional: Converter um documento no servidor
Se seu fluxo de trabalho requer uma exportação PDF de um arquivo Word enviado, habilite o plugin Converter na configuração Doconut (veja a documentação). Após o plugin ser registrado, você pode injetar DocumentConverter e chamar seu método ConvertAsync. A conversão é executada no servidor, portanto você nunca precisa do Office instalado no servidor web.
7. Considerações de escalonamento para gerenciamento de documentos de nível empresarial
- Front‑ends sem estado – O widget visualizador nunca mantém dados do documento; todo o processamento pesado permanece no servidor.
- Cache distribuído – Substitua o cache em memória padrão por um provedor distribuído (Redis, NCache) se você executar múltiplos nós de farm web. O mapeamento token‑para‑sessão funciona inalterado porque o middleware lê do
IMemoryCacheconfigurado. - Jobs em segundo plano – Você pode pré‑abrir documentos em um worker de background, armazenar o token em cache e entregá‑lo à UI depois. Apenas lembre‑se de que cada token tem uso único por sessão; reutilizar requer uma nova chamada
OpenDocumentAsync.
Esses padrões permitem que você construa uma plataforma de gerenciamento de documentos que escala de um portal intranet de servidor único para um serviço de nuvem multi‑região sem reescrever a lógica do visualizador.
8. Lista de verificação rápida para uma implementação pronta para produção
| Etapa | Ação |
|---|---|
| 1 | Registre os serviços Doconut em Program.cs (valide a licença). |
| 2 | Adicione o middleware Doconut em um ramo dedicado. |
| 3 | Exponha um endpoint /api/open que chame OpenDocumentAsync. |
| 4 | Passe o token retornado para objViewer.View(token) no cliente. |
| 5 | Chame CloseDocument(token) quando o visualizador estiver oculto ou a página descarregar. |
| 6 | (Opcional) Habilite ConverterPlugin se precisar de conversão no lado do servidor. |
| 7 | (Opcional) Troque IMemoryCache por um cache distribuído para escalonamento horizontal. |
Siga a lista, e você terá um fluxo completo, seguro e de alto desempenho de gerenciamento de documentos construído sobre o visualizador nativo .NET da Doconut.