DoconutOptions

Configure los servicios Doconut

DoconutOptions (namespace Doconut) es el único objeto de configuración para todo el SDK. Lo configuras una vez, dentro de AddDoconut(), y se registra como un singleton.

Esto es un cambio de ubicación tanto como de forma. En la biblioteca .NET Standard anterior, una instancia de DoconutOptions se construía en tiempo de pipeline y se pasaba a UseDoconut(new DoconutOptions { … }). Aquí el middleware no recibe opciones en absoluto — todo se establece durante el registro de servicios.

csharp
builder.Services.AddDoconut(options =>
{
    options.LicensePath     = "Doconut.Viewer.lic";
    options.UnsafeMode      = false;
    options.ShowDoconutInfo = false;
    options.AddPlugin<Doconut.Plugins.Dicom.DicomPlugin>();
});

Propiedades

TipoPropiedadValor predeterminadoDescripción
boolShowDoconutInfofalseCuando true, una solicitud de middleware sin token devuelve un banner de versión en lugar de 404. Útil como verificación rápida; mantenga false en producción.
boolUnsafeModefalseCuando true, omite la verificación de seguridad de la sesión ASP.NET en las solicitudes de página. Mantenga false en producción en un solo nodo (ver Conceptos básicos → Sesiones y Seguridad). Anteriormente escrito UnSafeMode.
stringMiddlewarePath"/doconut"Valor de coordinación para el endpoint de página‑imagen. Se valida, pero no monta una rama del pipeline; manténgalo alineado con el mapeo real de UseDoconut() y el BasePath del cliente.
stringResourcesPath"/doconut-res"Prefijo de ruta URL para los recursos incrustados JS/CSS/imagen/fuente.
stringLicensePath""Ruta al archivo de licencia. Vacío → siguiente fuente de licencia, luego descubrimiento automático; si no se encuentra nada → estado de evaluación con marca de agua y sin capacidades.
stringLicenseContent""Contenido XML bruto de la licencia (base de datos, variable de entorno, gestor de secretos). Tiene precedencia sobre LicensePath.
Stream?LicenseStreamnullLicencia como flujo, leída una vez al iniciar. Tiene precedencia sobre ambas fuentes restantes.
boolResetLicensefalseBandera de compatibilidad reservada. La implementación actual no la utiliza; reinicie la aplicación después de reemplazar una licencia.
DoconutPluginRegistryPluginRegistryRegistro de solo lectura que recopila contribuciones de plugins; consumido por la fábrica de visores. Poblado mediante AddPlugin<T>().

Precedencia de licencia (aplicada al registrar el servicio): LicenseStreamLicenseContentLicensePath → descubrimiento automático (ver Empezando → Configuración de Licencia).

Métodos

AddPlugin()

text
DoconutOptions AddPlugin<TPlugin>() where TPlugin : IDoconutPlugin, new()

Use este método para los paquetes Converter y DICOM de opción opt‑in publicados. La anotación y la Búsqueda normal son funciones con licencia incorporadas y no utilizan AddPlugin<TPlugin>().

Registra un plugin de primera parte (Converter, DICOM). Fluido — devuelve la instancia de opciones. AddDoconut() lanza InvalidOperationException por una licencia faltante, archivo legado TRIAL o licencia paga que no otorga la capacidad del plugin. Los registros temporales/Demo se conservan después de la expiración y quedan sujetos a la puerta de tiempo de ejecución (ver Conceptos básicos → Plugin System).

El widget Converter opt‑in se habilita con AddConverterWidget() y se expone a través de la propiedad de solo lectura ConverterWidget; sus opciones están documentadas en la página del Plugin Converter (Plugins → Converter Plugin).

RegisterViewer(extension, factory, defaultConfig?)

text
DoconutOptions RegisterViewer(
    string extension,                    // ".myext" — leading dot optional
    Func<IFormatViewer> factory,
    Func<BaseConfig>? defaultConfig = null)

Registra un visor personalizado para una extensión de archivo. Los visores personalizados tienen precedencia sobre los visores incorporados y de plugins y no están sujetos a licencia. Cuando defaultConfig se omite y un documento se abre sin una configuración explícita, se usa ImageConfig.

Lanza ArgumentException (Extension must be a non-empty file extension.) para una extensión vacía y ArgumentNullException para una fábrica nula.

Validación de inicio

AddDoconut() valida las opciones fallo rápido, de modo que una mala configuración se muestra como una excepción clara al iniciar en lugar de 404 confusos en tiempo de solicitud:

text
DoconutOptions.MiddlewarePath must be a non-empty path starting with '/'.
DoconutOptions.ResourcesPath must be a non-empty path starting with '/'.
DoconutOptions.MiddlewarePath and ResourcesPath must be different paths.

Configuraciones comunes

csharp
// Production: explicit license, everything locked down (all security defaults)
builder.Services.AddDoconut(options =>
{
    options.LicenseContent = builder.Configuration["Doconut:License"] ?? "";
});

// Custom paths (e.g. to avoid a route conflict)
builder.Services.AddDoconut(options =>
{
    options.MiddlewarePath = "/docs-engine";
    options.ResourcesPath  = "/docs-assets";
});

Cuando cambie ResourcesPath, mantenga sincronizado el ResPath del widget cliente (ver ViewerConfig). Esta es una de las dos configuraciones del lado del cliente que fallan sin mostrar un mensaje de error.

MiddlewarePath no es un mapeador automático de rutas de ASP.NET Core. Si Doconut debe responder solo bajo un prefijo personalizado, monte UseDoconut() en esa rama (por ejemplo con app.Map("/docs-engine", branch => branch.UseDoconut())) y establezca el BasePath del cliente a la misma URL. La aplicación de referencia, en cambio, mantiene la forma histórica de solicitud DocImage.axd en una rama MapWhen con BasePath: '/'.

¿Fue útil esta página?