DoconutExtensions
Registro de servicios y middleware
DoconutExtensions (namespace Doconut.Middleware) es la clase estática con las tres llamadas que cada host Doconut realiza: un registro de servicio y dos registros de middleware.
builder.Services.AddDoconut(options => { /* … */ });
// …
app.UseDoconutResources(); // BEFORE UseDoconut()
app.UseDoconut();AddDoconut
IServiceCollection AddDoconut(this IServiceCollection services, Action<DoconutOptions>? configure = null)Construye el DoconutOptions, los valida de forma inmediata (ver DoconutOptions → Validación de inicio) y registra el grafo completo de servicios:
| Servicio | Lifetime | Rol |
|---|---|---|
DoconutOptions | Singleton | El objeto de configuración |
IViewerFactory | Singleton | Mapea extensiones a visores de formato |
IDocumentSessionManager | Singleton | Token → caché de sesión (IMemoryCache también está registrado) |
IDoconutLicenseService | Singleton | Licencia cargada una vez al iniciar (precedencia: LicenseStream → LicenseContent → LicensePath → búsqueda automática) |
PageImageService | Singleton | Canal de imágenes de página (marca de agua/rotar/escalar/anotaciones) |
| Document security (access store) | Singleton | Concesiones para la vinculación token‑a‑sesión |
Viewer | Transient | La fachada pública de apertura/cierre |
DocumentConverter | Transient | Fachada de conversión — requiere el plugin Converter |
Health check "doconut" | — | Informa el estado de licencia/vencimiento a través de los chequeos de salud de ASP.NET |
Dos comportamientos que vale la pena conocer:
- Converter requiere su plugin. Resolver
DocumentConvertersinoptions.AddPlugin<ConverterPlugin>()lanza:
InvalidOperationException: No IDocumentConverter is registered. Add the converter plugin: options.AddPlugin<Doconut.Plugins.Converter.ConverterPlugin>().- La elegibilidad del plugin se valida al iniciar. Una licencia faltante, un archivo
TRIALheredado o una licencia paga sin la capacidad de un plugin registrado falla en el momento deAddDoconut(). Los registros temporales/Demo sobreviven a su fecha de expiración, mientras que las restricciones en tiempo de ejecución revocan las capacidades expiradas.
El chequeo de salud se integra con el mecanismo estándar de ASP.NET Core — mapealo si deseas el estado de la licencia en tu endpoint de salud:
app.MapHealthChecks("/health");UseDoconut
IApplicationBuilder UseDoconut(this IApplicationBuilder app)Agrega el middleware de imágenes de página de Doconut. Responde a cada solicitud que lleva un parámetro de consulta ?token= — páginas, miniaturas, búsqueda, anotaciones, acciones de página (la tabla completa de solicitudes está en Conceptos básicos → Cómo funciona el visor). Cuando UnsafeMode es false, la capa de seguridad de documentos se conecta automáticamente antes de él.
El ejemplo de referencia enruta las solicitudes del widget a través de una rama de ruta:
app.MapWhen(
ctx => ctx.Request.Path.Value?.EndsWith("DocImage.axd", StringComparison.OrdinalIgnoreCase) == true,
branch => branch.UseDoconut());UseDoconutResources
IApplicationBuilder UseDoconutResources(this IApplicationBuilder app)Sirve los JS, CSS, imágenes y fuentes incrustados en DoconutOptions.ResourcesPath (por defecto /doconut-res). Estos son los archivos para los que Viewer.ReferenceCss() / ReferenceScripts() generan etiquetas.
Siempre llámalo antes de UseDoconut(). Si el área del visor permanece vacía y la consola del navegador muestra 404 para /doconut-res/..., esta llamada falta o está mal ubicada.
Resumen del orden
app.UseRouting();
app.UseSession(); // required when UnsafeMode = false
app.UseDoconutResources(); // 1st Doconut call
app.UseDoconut(); // 2nd Doconut call (or via a MapWhen branch)¿Fue útil esta página?