ASP.NET Core

Tres llamadas de middleware, no una reescritura

Doconut se registra de la misma manera que todo lo demás en ASP.NET Core: como un servicio en el contenedor y middleware en el pipeline. Hereda tu autenticación, tu registro, tu grafo de DI y tu historia de despliegue, porque se ejecuta dentro de ellos en lugar de al lado.

3
llamadas de middleware para integrar
75
extensiones de archivo listas para usar
2
destinos de despliegue: Windows, Docker

El problema

El costo de integración que nadie presupone

La mayoría de los visores de documentos llegan como un servicio separado. Eso significa una segunda unidad de despliegue, un segundo conjunto de credenciales, un salto de red por el que ahora viajan tus documentos, y una segunda cosa por la que llamar a alguien a las 2 am.

Doconut es una biblioteca. AddDoconut() lo coloca en tu colección de servicios; UseDoconut() lo coloca en tu pipeline. Se ejecuta bajo la identidad de tu proceso, ve tu configuración, escribe en tu registrador y es desplegado por lo que ya despliega tu aplicación.

La consecuencia práctica es que la autorización permanece donde corresponde. Llamas a OpenDocumentAsync() después de tu propia verificación de permisos, y el visor solo podrá renderizar lo que hayas decidido entregarle.

Capacidades

Lo que el middleware te brinda

Razor Pages, MVC y APIs mínimas

El visor no está ligado a un estilo de hosting. Renderiza el div de montaje desde una vista Razor o una página estática y abre el documento desde una acción de controlador, un manejador de página o un endpoint mapeado.

Tu autenticación, sin cambios

Porque los endpoints viven en tu pipeline, [Authorize] funciona como siempre. No hay un segundo sistema de identidad con el que federar.

Seguridad de documentos respaldada por sesión

La seguridad de documentos se basa en el estado de sesión de ASP.NET, por lo que UseSession() debe registrarse antes de UseDoconut(). Significa que la noción del visor de quién eres es la misma que la de la aplicación.

Listo para granja web

Múltiples nodos detrás de un balanceador de carga comparten la caché de renderizado, de modo que una sesión abierta en un nodo sigue funcionando cuando la siguiente solicitud llega a otro.

Windows o Docker

IIS, Kestrel o una imagen de contenedor que construyas tú mismo. Nada de la integración cambia entre ellos, excepto dónde se monta el archivo de licencia.

Conversión en el mismo pipeline

Con el plugin Converter, DocumentConverter.ConvertAsync() se ejecuta en el mismo proceso — sin segundo servicio, sin carga temporal, sin ida y vuelta.

Integración

Registro y un endpoint abierto

UserMayRead y ResolvePath son tu propio código. Ese es el punto: Doconut nunca sabe qué documentos existen o quién tiene permiso para verlos.

Plataformas compatibles

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();

Detalles

Orden de registro y trampas

  • UseSession() debe ir antes de UseDoconut(). La seguridad de documentos depende de ello.
  • UseDoconutResources() debe ir antes de UseDoconut(), y debe estar detrás de la misma autenticación que el resto de la aplicación.
  • La vista Razor inyecta Doconut.Viewer y emite ReferenceCss / ReferenceScripts; jQuery debe cargarse antes de los scripts del visor.
  • Establece options.LicensePath desde la configuración para que el archivo de licencia pueda montarse como un secreto en lugar de estar incrustado en la imagen.

Preguntas frecuentes

¿Funciona con .NET 6 así como con .NET 8?

Sí. Ambos son compatibles y usan la misma arquitectura DI más middleware. Hay páginas dedicadas para cada uno si necesitas detalles específicos de la versión.

¿Hay un componente Razor o un tag helper?

No, y eso es intencional. La integración es siempre middleware más el widget JavaScript, lo que mantiene la misma integración válida en Razor Pages, MVC, Web Forms y Blazor en lugar de fragmentarse en cuatro.

¿Cómo se comporta detrás de un balanceador de carga?

La granja web y el despliegue distribuido son compatibles mediante una caché de renderizado compartida. Un documento abierto en un nodo sigue siendo legible cuando solicitudes posteriores llegan a otro.

¿Necesito Office instalado en el servidor?

No. El renderizado es nativo — no hay interop de Office, no hay Word sin cabeza, y no hay automatización COM que supervisar.

Pruébalo con tus propios documentos

Una licencia temporal tarda unos minutos en solicitarse y se ejecuta completamente en tu propia máquina. Los archivos que importan son los que ya están rompiendo tu visor actual.