Instalación

Agregar Doconut a su aplicación web .NET Framework 4.7.2

Doconut.NETFramework aloja el visor Doconut en una aplicación ASP.NET clásica en .NET Framework 4.7.2 — IIS o IIS Express, MVC 5 o Web Forms. La configuración tiene tres partes: el paquete NuGet, dos registros en Web.config y una llamada en Global.asax. Esta página cubre las tres; Inicio rápido luego coloca un documento en una página.

Requisitos

  • El proyecto web tiene como objetivo .NET Framework 4.7.2 o posterior. Un proyecto 4.7 no puede consumir este paquete; vuelva a apuntar primero.
  • El sitio se ejecuta en la tubería integrada (el valor predeterminado para los grupos de aplicaciones de IIS e IIS Express).

Esta página cubre Doconut.NETFramework 26.9.0 y posteriores. Las versiones 26.8.0 y anteriores apuntaban a .NET Framework 4.7 con una API diferente; esa línea está descontinuada. Actualizar una aplicación existente a través de esa frontera se cubre en Migración.

Instalar el paquete

Desde la consola del Administrador de paquetes:

powershell
Install-Package Doconut.NETFramework

O, en un proyecto con estilo SDK:

bash
dotnet add package Doconut.NETFramework

El motor de renderizado está incrustado en el paquete: no hay un ensamblado de motor separado que referenciar, copiar o desplegar. Las capacidades opcionales se entregan como paquetes propios — por ejemplo Doconut.NETFramework.Converter y Doconut.NETFramework.Dicom — y cada uno necesita una licencia que lo habilite (ver Sistema de complementos).

Configurar Web.config

Doconut sirve dos tipos de solicitud, y IIS enruta ambos a través de Web.config:

  • DocImage.axd — la página del visor, miniatura, búsqueda y punto final de anotaciones, servida por Doconut.DocImageHandler.
  • /doconut-res/* — los propios scripts, hojas de estilo e íconos del visor, incrustados en el ensamblado y servidos por Doconut.DoconutResourceModule.

Agregue ambos, más la configuración de la que dependen:

xml
<configuration>
  <system.web>
    <!-- MVC 5 only: Razor compiles views at run time and needs the netstandard facade. -->
    <compilation targetFramework="4.7.2">
      <assemblies>
        <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
      </assemblies>
    </compilation>
    <!-- maxRequestLength is in KILOBYTES: 200 MB. -->
    <httpRuntime targetFramework="4.7.2" maxRequestLength="204800" />
    <!-- Read .cshtml and .aspx files as UTF-8, not as the server's ANSI code page. -->
    <globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8" />
  </system.web>
  <system.webServer>
    <security>
      <requestFiltering>
        <!-- maxAllowedContentLength is in BYTES: the same 200 MB. -->
        <requestLimits maxAllowedContentLength="209715200" />
      </requestFiltering>
    </security>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="DoconutResourceModule" type="Doconut.DoconutResourceModule, Doconut" />
    </modules>
    <handlers>
      <add name="DocImage" verb="GET,HEAD,POST" path="DocImage.axd"
           type="Doconut.DocImageHandler, Doconut" />
    </handlers>
  </system.webServer>
</configuration>

Cada línea evita una falla que no genera excepción:

  • verb="GET,HEAD,POST" — mantenga HEAD. El visor envía una solicitud HEAD para la página 1 para detectar imágenes animadas. Sin este verbo, IIS responde 404 antes de que el controlador se ejecute: los documentos aún se muestran, pero la detección de animación nunca funciona y la consola del navegador se llena de 404.
  • runAllManagedModulesForAllRequests="true" — /doconut-res/*.js, .css y .png parecen archivos estáticos, e IIS los entregaría a su controlador de archivos estáticos antes de que el módulo de recursos los vea. El resultado es un visor sin scripts ni íconos.
  • <globalization fileEncoding="utf-8"> — los archivos de página guardados como UTF‑8 sin marca de orden de bytes se leen de otro modo con la página de códigos ANSI del servidor, por lo que cada carácter no ASCII llega al navegador doblemente codificado (un guión largo aparece como —). El archivo es correcto en disco, y la página aún declara <meta charset="utf-8">.
  • El ensamblado netstandard (MVC 5) — Razor compila las vistas cuando se solicitan por primera vez, con su propia lista de referencias que no incluye esta fachada. Una vista que haga algo dinámico más allá de un simple acceso a miembro falla con CS0012 y devuelve un 500 vacío, y solo las páginas que lo provocan fallan. El error del compilador aparece solo en el registro de eventos de Windows (fuente ASP.NET). Las aplicaciones Web Forms no necesitan esta línea.
  • Límites de carga — ASP.NET lee todo el cuerpo de la solicitud antes de que cualquier controlador se ejecute, por lo que una carga que supere estos límites es rechazada por IIS con su propia página de error. Mantenga maxRequestLength (kilobytes) y maxAllowedContentLength (bytes) sincronizados, y por encima del archivo más grande que sus usuarios abran o carguen.

Dos configuraciones más son importantes, y ambas suelen estar correctas ya:

  • El estado de sesión permanece activo. Por defecto una página se sirve solo a la sesión ASP.NET que abrió el documento, por lo que el sitio no debe establecer <sessionState mode="Off" />. Ver Sesiones y seguridad.
  • Redirecciones de enlace. Mantenga las redirecciones de enlace <runtime> que NuGet escribe en Web.config. En un proyecto con estilo SDK, cópielas del bin\<YourApp>.dll.config generado, porque ASP.NET clásico solo lee redirecciones de Web.config. Una redirección que nombre una versión que falta en bin\ detiene toda la aplicación con un 500 vacío al iniciar.

Registrar Doconut en Global.asax

No hay constructor ni canal de middleware en System.Web. Doconut se compone una vez por proceso de trabajo mediante DoconutHost.Initialize en Application_Start, y se libera con DoconutHost.Shutdown en Application_End:

csharp
// Global.asax.cs
protected void Application_Start()
{
    Doconut.DoconutHost.Initialize(options =>
    {
        options.LicensePath = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
    });
}

protected void Application_End()
{
    Doconut.DoconutHost.Shutdown();
}

DoconutHost.Initialize crea los servicios que el controlador, el módulo de recursos y tu propio código utilizan. Tu código los accede a través de DoconutHost.Services (ver DoconutHost). Sólo la primera llamada configura algo; una segunda llamada se ignora. En una aplicación MVC, también mantén las dos rutas de Doconut fuera del enrutamiento — Quick Start muestra el Application_Start completo.

Todas las opciones

DoconutOptions acepta el siguiente conjunto de propiedades configurables. Cada una es opcional.

PropiedadPredeterminadoDescripción
UnsafeModefalseCuando es false, DocImage.axd sirve una página solo a la sesión ASP.NET que abrió el documento. Cuando es true, cualquier solicitud que lleve el token es atendida. Déjalo en false.
ShowDoconutInfofalseCuando es true, una solicitud a DocImage.axd sin token responde con una barra de versión en lugar de 404. Útil como verificación rápida; desactívalo en producción.
ResourcesPath"/doconut-res"Donde el módulo de recursos sirve los scripts, estilos e íconos incrustados. Cambia esto solo junto con el ResPath del visor y cualquier IgnoreRoute de MVC.
LicensePath""Ruta completa al archivo de licencia. Vacío significa pasar al siguiente origen, y luego al descubrimiento automático.
LicenseContent""Contenido bruto de la licencia — desde una variable de entorno, un almacén secreto o una base de datos.
LicenseStreamnullLicencia como flujo, leída una vez al iniciar.
MiddlewarePath"/doconut"No se usa en este paquete. El punto final de la página es el controlador DocImage.axd declarado en Web.config, sea lo que sea que esté configurado aquí. Aún se valida: debe comenzar con / y diferir de ResourcesPath.
ResetLicensefalseNo se usa en este paquete. La licencia se lee una vez, en DoconutHost.Initialize; recicla el grupo de aplicaciones después de reemplazar un archivo de licencia.

Cuando se establece más de una fuente de licencia, LicenseStream prevalece sobre LicenseContent, que prevalece sobre LicensePath, que prevalece sobre el descubrimiento automático — ver License Setup.

csharp
Doconut.DoconutHost.Initialize(options =>
{
    options.LicensePath     = HostingEnvironment.MapPath("~/wwwroot/Doconut.Viewer.lic");
    options.ResourcesPath   = "/doconut-res"; // where the viewer's JS/CSS/images are served from
    options.UnsafeMode      = false;          // keep session security on
    options.ShowDoconutInfo = false;
});
// The page endpoint is not an option here: it is the DocImage.axd handler declared in Web.config.

Próximos pasos

  • Quick Start — abre un documento y rásterízalo en el navegador, en MVC 5 o Web Forms.
  • License Setup — dónde Doconut busca tu archivo de licencia.

¿Fue útil esta página?